根据嵌套顺序绑定数据框列表

时间:2012-08-13 13:01:37

标签: r list dataframe plyr

我有一个数据框df和一个函数process,它返回两个数据框ab的列表。我使用dlply在id列上拆分df,然后返回数据帧列表的列表。以下是近似实际数据和方法的示例数据/代码:

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是数据框列表的列表,嵌套列表将始终包含两个名为ab的数据框。在这种情况下,外部列表的长度为4。

我希望生成的是包含所有a数据框的数据框,以及指示其各自值的id列(我相信它会作为{{1}保留在列表中}属性,参见str(output))。然后类似于split_labels数据帧。

到目前为止,我已经部分使用此question来提供此代码:

b

这为我提供了最终的list <- unlist(output, recursive = FALSE) list.a <- lapply(1:4, function(x) { list[[(2*x)-1]] }) all.a <- rbind.fill(list.a) 数据框(同样适用于a,并且b具有不同的下标),但它没有我需要的id列,而且我是非常确定必须有一个更直接或更优雅的解决方案。理想情况下使用list清理干净。

1 个答案:

答案 0 :(得分: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