Не могу получить доступ к предметам после провала - PullRequest
1 голос
/ 26 января 2012

Я использую lapply, чтобы попытаться разделить строку символов во фрейме данных.Все строки похожи на "02D_48M_RHD".Я пытаюсь взять цифры перед «D» и перед «M».

Мое использование lapply, кажется, работает:

a <- lapply(res$description, strsplit, split="[DM]_", fixed=FALSE)

> a[[1]]
[[1]]
[1] "02"  "48"  "RHD"

Однако я не могу,для моей жизни выясните, как получить доступ только к первому элементу вектора в [ 1 ].Документация предполагает, что a[[1]][1] должен дать мне первый элемент, но вот что происходит:

> a[[1]][1]
[[1]]
[1] "02"  "48"  "RHD"

Я не понимаю, почему это не работает.R говорит мне, что это вектор, но он также говорит, что его длина равна единице.

> is.vector(a[[1]])
[1] TRUE
> length(a[[1]])
[1] 1

Я не уверен, что я неправильно понимаю.lapply дает результат не так, как я ожидаю?Я ожидаю список векторов длины три, и вот как это выглядит.Или это то, что я получаю, но пытаюсь получить к ним неправильный доступ?

В конце концов, я бы хотел добавить три столбца в мой фрейм данных, по одному для каждой из этих частей информации, таквсе, что могло бы помочь мне двигаться в этом направлении, будет с благодарностью.

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Я не думаю, что ваш вызов lapply необходим, так как strsplit уже работает с векторами.Как-то так может помочь:

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
2 голосов
/ 26 января 2012

strsplit уже векторизовано, поэтому нет необходимости переносить его в lapply. Вы запутались, потому что a - это список списков векторов, а не список векторов. То есть a[[1]] само по себе список из одного элемента, содержащий вектор.

Кроме того, списки являются "векторами". Вот почему is.vector возвращает TRUE. is.character должен вернуть FALSE.

Вы хотите что-то вроде:

splits    <- strsplit(res$description, "[DM]_", fixed=FALSE)
res$one   <- sapply(splits, "[", 1)
res$two   <- sapply(splits, "[", 2)
res$three <- sapply(splits, "[", 3)
1 голос
/ 26 января 2012
 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"

это делает неприятный вложенный список. Я думаю, что вы хотите:

> lapply(strsplit(x,split='[DM]_',fixed=F),'[',1)
[[1]]
[1] "02"

[[2]]
[1] "34"
...