我有一个数据框df
和一个函数process
,它返回两个数据框a
和b
的列表。我使用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
是数据框列表的列表,嵌套列表将始终包含两个名为a
和b
的数据框。在这种情况下,外部列表的长度为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
清理干净。
答案 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