【问题标题】:rbinding a list of lists of dataframes based on nested orderrbinding 基于嵌套顺序的数据框列表列表
【发布时间】:2012-08-13 13:01:37
【问题描述】:

我有一个数据框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 列(我相信这作为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 数据框(同样对于 blist 的不同下标),但是它没有我需要的 id 列,我很确定必须有一个更直接或更优雅的解决方案。理想情况下,使用plyr 进行清洁。

【问题讨论】:

  • 我不明白all.a“没有我需要的 id 列”是什么意思。如果您需要的 id 列与 output[[i]]$b 中的内容相同 id1,您不能将其添加到您的 process 函数中吗?

标签: r list dataframe plyr


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2021-04-20
    • 2016-12-16
    • 2018-03-06
    • 2020-05-21
    • 2017-03-14
    相关资源
    最近更新 更多