在列表中还原分割效果

时间:2013-05-19 22:28:17

标签: 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"     "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),但显然它不起作用。

非常感谢

2 个答案:

答案 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'])