0

我有一个数据框df和一个返回两个数据框列表的函数processa以及b. 我使用 dlply 拆分dfid 列,然后返回数据帧列表的列表。这是近似实际数据和方法的示例数据/代码:

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指示它们各自值的列(我相信这作为属性留在列表中split_labels,请参阅 str(输出))。然后对于数据帧也是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有不同的下标 into list),但是它没有我需要的 id 列,我很确定必须有一个更直接或更优雅的解决方案。理想情况下使用干净的东西plyr

4

1 回答 1

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
于 2012-08-13T13:31:02.173 回答