我有一个列表,我想将其转换为带有两列的data.frame。问题是列表元素的长度不相等,这是我的数据外观的一个例子:
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
其中删除了与AB1G相对应的元素。我想恢复分割效果以获得相同的结构:
new.df
A1CF A1CF
A1CF APOBEC1
A1CF CUGBP2
A1CF KHSRP
A1CF SYNCRIP
A1CF TNPO2
A2LD1 A2LD1
A2LD1 PRPSAP2
A2LD1 RPL15
A2LD1 TANC1
A2M A2M
A2M ADAM19
A2M ADAMTS1
A2M AMBP
A2M ANXA6
A2M APOE
我尝试过:df.new <- do.call(rbind, my.list)
,但显然它不起作用。
非常感谢
答案 0 :(得分:5)
使用这些虚拟数据,
ll <- list(a = letters[3:6],
b = LETTERS[1:10],
c = letters[1:2])
stack(ll)
或
reshape2::melt(ll, id=1)
或
plyr::ldply(ll, cbind)
应该给你大致正确的格式
答案 1 :(得分:2)
如果你有一个向量列表,@ 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))
如果您有一个来自拆分的data.frame列表,unsplit
应该是合适的。
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'])