2013-10-04 42 views
0

與data.frame如開始:強制data.frame到列表中排

df = read.table(text = "ref1 code1,code2 
      ref2 code3,code4,code5 
      ref3 code6", stringsAsFactors=F) 
names(df) = c('id', 'codes') 
print(df) 
    id    codes 
1 ref1  code1,code2 
2 ref2 code3,code4,code5 
3 ref3    code6 

希望的一個結果是這樣的:

lst = list() 
for(i in 1:3) lst[[df[i,1]]] = strsplit(df[i,2], ',')[[1]] 
print(lst) 
$ref1 
[1] "code1" "code2" 

$ref2 
[1] "code3" "code4" "code5" 

$ref3 
[1] "code6" 

它怎麼可能可以去這一點沒有(慢)迭代? as.list(df)只能按列操作:

$id 
[1] "ref1" "ref2" "ref3" 

$codes 
[1] "code1,code2"  "code3,code4,code5" "code6" 

在此先感謝。

回答

3

事情是這樣的,也許:

lapply(split(df$codes,df$id),function(x) strsplit(x,split = ",")[[1]]) 
$ref1 
[1] "code1" "code2" 

$ref2 
[1] "code3" "code4" "code5" 

$ref3 
[1] "code6" 

下面提到阿難的解決方案是恕我直言,遠遠優於:

setNames(strsplit(df$codes, ","), df$id) 
+0

啊'split'就是我過去的!但我喜歡你的小'lapply'蓬勃發展:) – geotheory

+1

我個人比較喜歡'setNames(strsplit(df $ codes,「,」),df $ id)',但是'split'步驟中的概念爲+1。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Yeesh。我認爲你非常慷慨地讚揚我不必要地使用'split'。 – joran

2

這裏的另一種方法。

> lst <- unlist(apply(df[,2, drop=FALSE], 1, strsplit, ","), recursive=FALSE) 
> names(lst) <- df[,1] 
$ref1 
[1] "code1" "code2" 

$ref2 
[1] "code3" "code4" "code5" 

$ref3 
[1] "code6" 

而且使用setNames命名名單中@ Henrik的回答

> setNames(unlist(apply(df[,2, drop=FALSE], 1, strsplit, ","), recursive=FALSE), df$id) 
2

你也可以嘗試以下@Ananda Mahto的評論此

library(splitstackshape) 
ll <- concat.split.list(data = df, 
         split.col = "codes",     
         drop = TRUE)[[2]] 
names(ll) <- df$id 
ll 

# $ref1 
# [1] "code1" "code2" 
# 
# $ref2 
# [1] "code3" "code4" "code5" 
# 
# $ref3 
# [1] "code6 

更新。謝謝!

setNames(concat.split.list(df, "codes")[["codes_list"]], df$id) 
+1

或者:'setNames(concat.split.list(df,「codes」)[[「codes_list」]],df $ id)'(因爲我們知道什麼結果列將是,並且對於'list'方法,'sep =「,」'是默認設置)。 +1,順便說下:) – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto,謝謝你對'split.col'的評論和改變。我讀完數據後錯過了「名字」部分... – Henrik