连接R中的子列表

时间:2020-06-09 12:33:19

标签: r list

我有一个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数据类型不是基本类型。有想法吗?

1 个答案:

答案 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