Używam lapply
aby spróbować podzielić ciąg znaków w ramce danych. Wszystkie łańcuchy wyglądają podobnie "02D_48M_RHD"
. Próbuję złapać liczby przed "D" i przed "M".
Moje wykorzystanie lapply
wydaje się działać:
a <- lapply(res$description, strsplit, split="[DM]_", fixed=FALSE)
> a[[1]]
[[1]]
[1] "02" "48" "RHD"
Jednak nie mogę, na moje życie, dowiedzieć się, jak uzyskać dostęp tylko do pierwszego elementu wektora w [1]. The dokumentacja sugeruje, że a[[1]][1]
powinien dać mi pierwszy element, ale tak się dzieje:
> a[[1]][1]
[[1]]
[1] "02" "48" "RHD"
Nie rozumiem, dlaczego to nie działa. R mówi mi, że jest to wektor, ale mówi również, że ma długość jednego.
> is.vector(a[[1]])
[1] TRUE
> length(a[[1]])
[1] 1
Nie jestem pewien, co nieporozumienie. Jest lapply
dając wynik w inny sposób, niż się spodziewam? Spodziewam się listy wektorów o długości trzeciej i tak to wygląda. Czy to jest to, co dostaję, ale próbuję uzyskać do nich dostęp nieprawidłowy?
Ostatecznie chciałbym dodać trzy kolumny do mojej ramki danych, po jednej dla każdej z tych informacji, więc wszystko, co mogłoby mi pomóc w tym kierunku, byłoby bardzo docenione.
Odpowiedzi:
2 dla odpowiedzi № 1strsplit
jest już wektoryzowany, więc nie trzeba go zawijać lapply
. Jesteś zdezorientowany, ponieważ a
jest listą wektorów, a nie listą wektorów. To znaczy. a[[1]]
jest samo jednoczęściowa lista zawierająca wektor.
Również listy są "wektorami". Dlatego is.vector
zwraca TRUE
. is.character
powinien powrócić FALSE
.
Chcesz coś takiego:
splits <- strsplit(res$description, "[DM]_", fixed=FALSE)
res$one <- sapply(splits, "[", 1)
res$two <- sapply(splits, "[", 2)
res$three <- sapply(splits, "[", 3)
2 dla odpowiedzi nr 2
Nie sądzę, aby Twój apel do lapply był konieczny, ponieważ strsplit już działa na wektorach. Coś takiego może pomóc:
a <- "02D_48M_RHD"
#Create a vector of values to splot
aa <- c(a,a,a,a,a,a,a)
#rbind them together and make a data.frame
> data.frame(do.call("rbind", strsplit(aa, split="[DM]_", fixed=FALSE)))
X1 X2 X3
1 02 48 RHD
2 02 48 RHD
3 02 48 RHD
4 02 48 RHD
5 02 48 RHD
6 02 48 RHD
7 02 48 RHD
1 dla odpowiedzi nr 3
x=c("02D_48M_RHD", "34D_98M_AHR")
> lapply(x,strsplit,split="[DM]_",fixed=F)
[[1]]
[[1]][[1]]
[1] "02" "48" "RHD"
[[2]]
[[2]][[1]]
[1] "34" "98" "AHR"
to czyni nieprzyjemną listę z listą. Myślę, że chcesz:
> lapply(strsplit(x,split="[DM]_",fixed=F),"[",1)
[[1]]
[1] "02"
[[2]]
[1] "34"