1

我正在lapply尝试拆分数据框中的字符串。字符串看起来都类似于"02D_48M_RHD"。我正在尝试获取“D”之前和“M”之前的数字。

我的使用lapply似乎有效:

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

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

但是,在我的一生中,我无法弄清楚如何仅访问 a[ 1 ] 中向量的第一个元素。文档建议应该给我第a[[1]][1]一个元素,但这就是发生的事情:

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

我不明白为什么这不起作用。R 告诉我这是一个向量,但它也说它的长度为 1。

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

我不确定我在误解什么。是否lapply以不同于我期望的方式提供输出?我期望一个长度为三的向量列表,这就是它的样子。或者,这是我得到的,但我试图错误地访问它们?

最后,我想在我的数据框中添加三列,每一条信息对应一列,所以任何可以帮助我朝这个方向前进的东西都将不胜感激。

4

3 回答 3

2

strsplit已经矢量化,因此无需将其包装在lapply. 你很困惑,因为a它是一个向量列表,而不是一个向量列表。Iea[[1]]本身就是一个包含向量的单元素列表。

此外,列表是“向量”。这就是为什么is.vector返回TRUEis.character应该返回FALSE

你想要这样的东西:

splits    <- strsplit(res$description, "[DM]_", fixed=FALSE)
res$one   <- sapply(splits, "[", 1)
res$two   <- sapply(splits, "[", 2)
res$three <- sapply(splits, "[", 3)
于 2012-01-26T18:38:03.987 回答
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
于 2012-01-26T18:43:43.640 回答
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"
于 2012-01-26T18:41:36.403 回答