在lapply之后无法访问项目

时间:2012-01-26 18:31:59

标签: r lapply

我正在使用lapply尝试在数据框中拆分字符串。这些字符串看起来都与"02D_48M_RHD"类似。我想在“D”之前和“M”之前抓住数字。

我对lapply的使用似乎有效:

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

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

但是,对于我的生活,我不能想出如何在[1]中仅访问向量的第一个元素。 documentation表明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的向量列表,这就是它的样子。或者,这是我得到的,但我试图错误地访问它们?

最后,我想在我的数据框中添加三列,每列都有一条信息,所以任何可以帮助我朝这个方向前进的内容都会非常感激。

3 个答案:

答案 0 :(得分:2)

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 :(得分:2)

我不认为你对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 :(得分:1)

 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"