从R中的并行结构化列表中提取多个数据帧

时间:2014-10-07 17:07:10

标签: r list dataframe extract

我对列表的了解有限让我陷入困境。我有一个列表,其中包含每个级别不同长度的多个数据帧,具有并行结构,如下所示:

list.fun <- function(y) {
  x1 <- data.frame(x = rnorm(20, mean=y))
  x2 <- data.frame(x = rnorm(10, mean=y))
  return(list(x1=x1, x2=x2))
}
## make list  
foo <- lapply(1:3, list.fun)

我想提取具有相同名称的所有数据帧(在本例中为x1),将标签指定为新因子,并将它们组合成一个单独的数据帧。这种手动方法有效,但我正在寻找更通用的东西。

## split results into into two data frames
b1 <- foo[[1]]$x1
b2 <- foo[[2]]$x1
b3 <- foo[[3]]$x1
b1$trial <- "t1"
b2$trial <- "t2"
b3$trial <- "t3"
## combine
bar <- rbind(d1, d2, d3)

如果已经提出这个问题,请道歉!

1 个答案:

答案 0 :(得分:1)

您可以使用x1运算符选择名为[[的所有元素:

lapply(foo, "[[", "x1")

然后,您可以使用do.call

将它们绑定在一起
do.call(rbind, lapply(foo, '[[', "x1"))

> head(do.call(rbind, lapply(foo, '[[', "x1")))
          x
1 1.3599227
2 0.7760733
3 0.9852219
4 0.5447365
5 2.1185779
6 0.5419102
> nrow(do.call(rbind, lapply(foo, '[[', "x1")))
[1] 60

对于更一般的情况:

res <- do.call(rbind, lapply(seq_along(foo)
                  , function(x){
                    out <- foo[[x]][['x1']]
                    out$trial <- paste0("t", x)
                    out
                  }
                  )
)


> head(res)
          x trial
1 1.3599227    t1
2 0.7760733    t1
3 0.9852219    t1
4 0.5447365    t1
5 2.1185779    t1
6 0.5419102    t1