2011-05-19 48 views
2

的specical格式我有包括不同数量的条目的子列表的列表,如下所示:[R组合名单表

x <- list(
    c("a1", "a2", "a3", "a4", "a5", "a6", "a7"), 
    c("b1","b2","b3","b4"), 
    c("c1","c2","c3"), 
    c("d1") 
) 

我想将这个文件转换成数据帧有三列(第一列是子列表的顺序,即1到4:第二列是条目;第三位代表我的停止代码,因此,我对每行使用了1,最终结果如下:

1 a1 1 
1 a2 1 
1 a3 1 
1 a4 1 
1 a5 1 
1 a6 1 
1 a7 1 
2 b1 1 
2 b2 1 
2 b3 1 
2 b4 1 
3 c1 1 
3 c2 1 
3 c3 1 
4 d1 1 

我试过使用cbind,但是,在我看来,只适用于具有相同条目数的子列表。更聪明的方式呢?

回答

2

一种选择是使用拆分,应用在包装plyr相结合的功能。在这种情况下,你需要ldply将于列表和元素结合到data.frame:

library(plyr) 
ldply(seq_along(x), function(i)data.frame(n=i, x=x[[i]], stop=1)) 

    n x stop 
1 1 a1 1 
2 1 a2 1 
3 1 a3 1 
4 1 a4 1 
5 1 a5 1 
6 1 a6 1 
7 1 a7 1 
8 2 b1 1 
9 2 b2 1 
10 2 b3 1 
11 2 b4 1 
12 3 c1 1 
13 3 c2 1 
14 3 c3 1 
15 4 d1 1 
+0

很好用ldply了。 – a83 2011-05-19 07:56:04

3
library(reshape2) 

x <- melt(x) ## Done... 

## Trivial... 
x$stop <- 1 
x <- x[c(2,1,3)] 
+0

你可能是指'库(reshape2)'' – Andrie 2011-05-19 07:45:51

+1

是reshape2'的reshape''的更新是显著快。 – Andrie 2011-05-19 07:47:54

+0

赞,谢谢!他们从我的个人资料中自动加载,所以我很少手动调用它们! – 2011-05-19 07:48:12

6

这里有一个例子:

data.frame(
    x=rep(1:length(x), sapply(x, length)), 
    y=unlist(x), 
    z=1 
) 
+0

+1不错的使用unlist – Andrie 2011-05-19 07:46:59