我有一个foreach循环,它生成如下列表的列表:
library(doParallel)
foo = foreach(i = 1:3) %do% {
x = rnorm(100)
y = rnorm(100)
m = lm(y~x)
m2 = lm(y~1)
retRes = list('a' = m, 'b' = m2)
return(retRes)
}
结果如下:
> foo
[[1]]
[[1]]$a
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
-0.06506 -0.00199
[[1]]$b
Call:
lm(formula = y ~ 1)
Coefficients:
(Intercept)
-0.06529
[[2]]
[[2]]$a
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
-0.1366 0.1934
[[2]]$b
Call:
lm(formula = y ~ 1)
Coefficients:
(Intercept)
-0.125
等
我想将列表连接起来,这样我就可以看到类似的东西
list(a = list of models "m"; b = list of models "m2")
我不能使用以下建议之一中描述的do.call/rbind技巧,因为element数据类型不是基本类型。有想法吗?
答案 0 :(得分:2)
正如评论中提到的那样,一个示例会有所帮助,并且我不确定“具有$ a和$ b的顶级元素”是什么意思,但是可以做您想做的一件事是“ do.call”
我想您的原始数据集是使用以下方法创建的:
> your_dataset=list(list(a=3,b=5),list(a=3,b=5),list(a=3,b=5))
> print(your_dataset)
[[1]]
[[1]]$a
[1] 3
[[1]]$b
[1] 5
[[2]]
[[2]]$a
[1] 3
[[2]]$b
[1] 5
[[3]]
[[3]]$a
[1] 3
[[3]]$b
[1] 5
如果是这种情况,而您想要的是某种我认为您需要的内容,那么您只需要做:
> do.call("rbind.data.frame",your_dataset)
a b
[1,] 3 5
[2,] 3 5
[3,] 3 5
然后您可以使用数据框符号“ $”将这两列作为列表进行访问:
> df=do.call("rbind.data.frame",your_dataset)
> df$a
[1] 3 3 3
> df$b
[1] 5 5 5
[EDIT]如果原始数据集是由非原始数据组成的,并且我们想要一个列表列表,而不是一个实际的data.frame
:
> header=c(a="a",b="b")
> new_list=lapply(header,function(h)lapply(your_dataset,"[[",h))
> new_list$a
[[1]]
[1] 3
[[2]]
[1] 3
[[3]]
[1] 3
> new_list$b
[[1]]
[1] 5
[[2]]
[1] 5
[[3]]
[1] 5
您最终可以通过查看初始列表的名称直接创建header
:
> header=unlist(unique(lapply(your_dataset,names)))
> names(header)=header