/ / Nie można uzyskać dostępu do elementów po lapply - r, lapply

Nie można uzyskać dostępu do elementów po lapply - r, lapply

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 № 1

strsplit 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"