2012-01-26 108 views
1

我正在使用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告诉我这是一个向量,但它也说它长度为1。

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

我不确定我误解了什么。 lapply是否以某种方式给出输出,而不是我所期望的?我期望一个长度为三的向量列表,这就是它的样子。或者,那是我得到的,但我试图访问他们错了?最后,我想在我的数据框中添加三列,每条信息都有一列,所以任何可以帮助我朝这个方向移动的东西都将不胜感激。

回答

2

strsplit已经被矢量化了,所以没有必要将它包装在lapply中。你很困惑,因为a是一系列向量列表,而不是向量列表。即a[[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) 
+0

Doh。当然,它已经被矢量化了! – Wilduck

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" 
+0

这很有帮助,但我很好奇,为什么我无法得到最终列表中的内部项目。 – Wilduck

+1

其包含字符串的列表列表。看看'str(a)'。一个[[1]] [[1]] [1]会得到它。你也可以看看class(a)class(a [[1]])和class(a [[1]] [[1]]) – Justin

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