0

次のような 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" 

前もって感謝します。

4

3 に答える 3

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"

以下で言及されているアナンダのソリューションは、IMHOよりもはるかに優れています。

setNames(strsplit(df$codes, ","), df$id)
于 2013-10-04T15:39:05.463 に答える
2

これを試すこともできます

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

@Ananda Mahto のコメントに従って更新します。ありがとう!

setNames(concat.split.list(df, "codes")[["codes_list"]], df$id)
于 2013-10-04T16:01:45.063 に答える
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)
于 2013-10-04T15:40:45.993 に答える