2012-08-13 55 views
0

我有一个数据帧,df和函数process,返回两个数据帧的列表,ab。我使用dlply将id列上的df分开,然后返回数据框列表的列表。下面是样本数据/代码近似于实际的数据和方法:rbinding基于嵌套顺序的数据帧列表

df <- data.frame(id1=rep(c(1,2,3,4), each=2)) 

process <- function(df) { 
    a <- data.frame(d1=rnorm(1), d2=rnorm(1)) 
    b <- data.frame(id1=df$id1, a=rnorm(nrow(df)), b=runif(nrow(df))) 
    list(a=a, b=b) 
} 

require(plyr) 
output <- dlply(df, .(id1), process) 

output是dataframes的名单列表,嵌套列表总会有两个dataframes,命名为ab。在这种情况下,外部列表的长度为4

什么我期待产生与所有a dataframes一个数据帧,与id列指示各自的值(我相信这是在列表中左边沿split_labels属性,请参阅str(输出))。然后类似地对于b数据帧。

到目前为止,我已经在部分使用这个question想出这样的代码:

list <- unlist(output, recursive = FALSE) 
list.a <- lapply(1:4, function(x) { 
    list[[(2*x)-1]] 
}) 
all.a <- rbind.fill(list.a) 

这给了我最后的a数据框(且同样b用不同的标为list),但是它不没有我需要的id列,我非常肯定,必须有一个更直接或优雅的解决方案。理想情况下使用plyr清理干净。

+0

我不明白这是什么意思'all.a'“没有我需要的id列”。如果你需要的id列与'output [[i]] $ b'中的id列是相同的'id1',那么你不能将它添加到你的'process'函数吗? – 2012-08-13 16:23:42

回答

1

不是很干净,但你可以尝试这样的事情(假设相同的数据生成过程)。

list.aID <- lapply(1:4, function(x) { 
cbind(list[[(2*x) - 1]], list[[2*x]][1, 1, drop = FALSE]) 
}) 

all.aID <- rbind.fill(list.aID) 
all.aID 

all.aID 
     d1  d2 id1 
1 0.68103 -0.74023 1 
2 -0.50684 1.23713 2 
3 0.33795 -0.37277 3 
4 0.37827 0.56892 4