我正在使用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的向量列表,这就是它的样子。或者,这是我得到的,但我试图错误地访问它们?
最后,我想在我的数据框中添加三列,每列都有一条信息,所以任何可以帮助我朝这个方向前进的内容都会非常感激。
答案 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"