2009-11-04 14 views
35

Mam następujący wektor:Podział wektorem ciąg w R

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1") 

chciałbym tylko zachować drugą liczbę w każdym z atomów tego wektora, więc byłoby przeczytać:

c(2,1,2,1,2,1,2,1,2,1) 
+0

Czy możesz zaakceptować odpowiedź, aby oznaczyć pytanie jako rozwiązane? – MERose

Odpowiedz

31

Nie ma chyba lepszego sposobu, ale tutaj są dwa podejścia z strsplit():

as.numeric(data.frame(strsplit(tmp3, " "))[2,]) 
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2])) 

as.numer IC() może nie być konieczne, jeśli można użyć znaków ...

+0

To jest eleganckie rozwiązanie. Właśnie tego szukałem. Dzięki! – Zak

+0

Próbowałem użyć twojego rozwiązania, ale zamiast tego użyłem kolumny ramki danych i nie zadziałało od razu. Dodam, że w tych przypadkach trzeba go przekształcić w listę. 'as.numeric (data.frame (strsplit (jak.list (df $ columnx), "")) [2,]) ' – pedrosaurio

5
substr(x = tmp3, start = 6, stop = 6) 

Dopóki struny są zawsze tej samej długości, to powinno załatwić sprawę.

(I, oczywiście, nie trzeba określać nazwy argumentów - substr(tmp3, 6, 6) działa dobrze, zbyt)

21

Jeden przydałby read.table na textConnection:

X <- read.table(textConnection(tmp3)) 

następnie

> str(X) 
'data.frame': 10 obs. of 2 variables: 
$ V1: int 1500 1500 1510 1510 1520 1520 1530 1530 1540 1540 
$ V2: int 2 1 2 1 2 1 2 1 2 1 

, więc X$V2 jest tym, czego potrzebujesz.

4

ten powinien zrobić:

library(plyr) 
ldply(strsplit(tmp3, split = " "))[[2]] 

Jeśli potrzebujesz wektor numeryczną, użyj

as.numeric(ldply(strsplit(tmp3, split = " "))[[2]]) 
9

Co moim zdaniem jest najbardziej elegancki sposób to zrobić

>  res <- sapply(strsplit(tmp3, " "), "[[", 2) 

If potrzebujesz go jako liczby całkowitej

>  storage.mode(res) <- "integer" 
+0

Również' res <- as.numeric (sapply (...)) 'działa również; 'storage.mode' jest trochę przerażający – user295691

-1

Łatwiejszy sposób, aby podzielić 1 Kolumna na 2 kolumnach poprzez data.table

require(data.table) 
data_ex = data.table(a = paste(sample(1:3, size=10, replace=TRUE),"-separate", sep="")) 
data_ex[, number:= unlist(strsplit(x=a, split="-"))[[1]], by=a] 
data_ex[, word:= unlist(strsplit(x=a, split="-"))[[2]], by=a ] 
8

To zależy trochę od tego, jak bardzo rzeczywisty dane dopasowuje przykładowe dane zostały podane. I jesteś po prostu staramy się wszystko po przestrzeni, można użyć gsub:

gsub(".+\\s+", "", tmp3) 
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1" 

Jeśli próbujesz zaimplementować reguły bardziej skomplikowany niż „wziąć wszystko po przestrzeni”, będziesz potrzebować bardziej skomplikowana regularna ekspresja.

+0

czy możesz wyjaśnić to ... – user3067923

+0

funkcja' gsub' służy do zamiany dopasowań regex z czymś innym. W tym przypadku używamy wyrażenia ". + \\ s +" i zastępujemy wszystkie znalezione dopasowania pustym ciągiem "" ". Wyrażenie tłumaczy się na "Dopasuj cokolwiek na początku, ale musi się kończyć spacją" (przestrzeń znaków jest zapisana jako '\\ s') –

1

Inną opcją jest scan(). Aby uzyskać drugą wartość, możemy użyć podzestawu logicznego.

scan(text = tmp3)[c(FALSE, TRUE)] 
# [1] 2 1 2 1 2 1 2 1 2 1