【发布时间】:2012-08-13 13:01:37
【问题描述】:
我有一个数据框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 列(我相信这作为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 进行清洁。
【问题讨论】:
-
我不明白
all.a“没有我需要的 id 列”是什么意思。如果您需要的 id 列与output[[i]]$b中的内容相同id1,您不能将其添加到您的process函数中吗?