2012-01-26 183 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