R 恢复列表中的拆分效果
我有一个列表,我想把它转换成一个带有两列的data.frame。问题在于列表元素的长度不相等,下面是我的数据的外观示例:R 恢复列表中的拆分效果,r,R,我有一个列表,我想把它转换成一个带有两列的data.frame。问题在于列表元素的长度不相等,下面是我的数据的外观示例: my.list $A1CF [1] "A1CF" "APOBEC1" "CUGBP2" "KHSRP" "SYNCRIP" "TNPO2" $A2LD1 [1] "A2LD1" "PRPSAP2" "RPL15" "TANC1" $A2M [1] "A2M" "ADAM19" "ADAMTS1" "AMBP" "AN
my.list
$A1CF
[1] "A1CF" "APOBEC1" "CUGBP2" "KHSRP" "SYNCRIP" "TNPO2"
$A2LD1
[1] "A2LD1" "PRPSAP2" "RPL15" "TANC1"
$A2M
[1] "A2M" "ADAM19" "ADAMTS1" "AMBP" "ANXA6" "APOE"
此列表来自上一个data.frame:
my.list <- split(df$V2, df$V1)
df
V1 V2
1 A1BG A1BG
2 A1BG CRISP3
3 A1CF A1CF
4 A1CF APOBEC1
5 A1CF CUGBP2
6 A1CF KHSRP
7 A1CF SYNCRIP
8 A1CF TNPO2
9 A2LD1 A2LD1
10 A2LD1 PRPSAP2
11 A2LD1 RPL15
12 A2LD1 TANC1
13 A2M A2M
14 A2M ADAM19
15 A2M ADAMTS1
16 A2M AMBP
17 A2M ANXA6
18 A2M APOE
我尝试过:
df.new使用这些虚拟数据
ll <- list(a = letters[3:6],
b = LETTERS[1:10],
c = letters[1:2])
stack(ll)
或
如果您有一个向量列表,@baptiste将为您提供大致正确的格式,,并为该列表提供更简明和一般的答案
您还可以应用unsplit
,即split
的反向操作
options(stringsAsFactors = FALSE)
df <- data.frame(V1 = c('A1BG', 'A1BG', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF',
'A2LD1', 'A2LD1', 'A2LD1', 'A2LD1', 'A2M', 'A2M', 'A2M', 'A2M',
'A2M', 'A2M'),
V2 = c('A1BG', 'CRISP3', 'A1CF', 'APOBEC1', 'CUGBP2', 'KHSRP', 'SYNCRIP',
'TNPO2', 'A2LD1', 'PRPSAP2', 'RPL15', 'TANC1', 'A2M', 'ADAM19',
'ADAMTS1', 'AMBP', 'ANXA6', 'APOE'))
my.list <- split(df$V2, df$V1)
newdat <- data.frame(V1=df$V1, V2=unsplit(my.list, df$V1))
或
newdf我喜欢@baptiste answer。我还想建议您将plyr
包作为一种通用框架,一次完成此类拆分/应用/合并工作。+1还要注意,如果您在对df$V1
进行子集设置时使用drop=TRUE
,则无需指定stringsAsFactors=FALSE
。亲爱的@baptiste,非常感谢您的回复,但是当我从列表中删除一些项目,然后使用ldply恢复拆分效果时,发生了一些“有趣”的事情。如果我还原分割的文件,然后我运行一些分析,删除的文件会再次出现……你会意识到,如果我不在你身后看着你的电脑屏幕,我无法回答这个问题。如果你有一个新问题,请发布一个完整的和最小的重复性的例子作为一个新问题。
reshape2::melt(ll, id=1)
plyr::ldply(ll, cbind)
options(stringsAsFactors = FALSE)
df <- data.frame(V1 = c('A1BG', 'A1BG', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF',
'A2LD1', 'A2LD1', 'A2LD1', 'A2LD1', 'A2M', 'A2M', 'A2M', 'A2M',
'A2M', 'A2M'),
V2 = c('A1BG', 'CRISP3', 'A1CF', 'APOBEC1', 'CUGBP2', 'KHSRP', 'SYNCRIP',
'TNPO2', 'A2LD1', 'PRPSAP2', 'RPL15', 'TANC1', 'A2M', 'ADAM19',
'ADAMTS1', 'AMBP', 'ANXA6', 'APOE'))
my.list <- split(df$V2, df$V1)
newdat <- data.frame(V1=df$V1, V2=unsplit(my.list, df$V1))
my.list <- split(df, df$V1)
newdf <- unsplit(my.list[!names(my.list) %in% 'A1BG'], df$V1[!df$V1 %in% 'A1BG'])
newdf <- do.call(rbind, my.list[!names(my.list) %in% 'A1BG'])