5

我有一个列表,我想将其转换为具有两列的 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),但显然它没有用。

非常感谢

4

2 回答 2

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)

应该给你大致正确的格式

于 2013-05-19T22:38:35.660 回答
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']) 
于 2013-05-20T04:13:47.513 回答