我对列表的了解有限让我陷入困境。我有一个列表,其中包含每个级别不同长度的多个数据帧,具有并行结构,如下所示:
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)
如果已经提出这个问题,请道歉!
答案 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