首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按名称合并内部嵌套列表元素

按名称合并内部嵌套列表元素
EN

Stack Overflow用户
提问于 2022-09-11 09:41:18
回答 2查看 54关注 0票数 1

我已经问过这个问题了,但没有很好的表现,所以我决定从头再问一次。

我在R中有一个大List对象,包含100个不同模型的输出列表,每个输出本身就是一个包含模型所有参数的统计信息的列表。因此,我有一个子列表的手段,一个为sd,等等,在每一个100输出列表。每个统计数据对于模型的每个参数都有一个向量或矩阵。我想要的是将所有100个列表输出合并到一个大列表中,方法是根据统计数据和参数名称对它们进行聚合。

代码语言:javascript
复制
modeloutputs <- list("model1"=list("simlist"=list("N"=c(1,2,3,4,5,6,7), "sigma"=c(1,2,3,4), "theta"=c(7,8,9)),
                                   "sd" = list("N"=c(6), "sigma"=c(6.5), "theta"=matrix(6:11, nrow = 2, ncol = 3)), 
                                   "mean" = list("N"=c(3), "sigma"=c(3.5), "theta"=matrix(6:11, nrow = 2, ncol = 3))),
                     "model2"=list("simlist"=list("N"=c(8,9,10,11,12,13,14), "sigma"=c(1,2,3,4), "theta"=c(7,8,9)),
                                   "sd" = list("N"=c(7), "sigma"=c(8.5), "theta"=matrix(6:11, nrow = 2, ncol = 3)), 
                                   "mean" = list("N"=c(5), "sigma"=c(5.5), "theta"=matrix(6:11, nrow = 2, ncol = 3))),
                     "model3"=list("simlist"=list("N"=c(15,16,17,18,19,20,21), "sigma"=c(1,2,3,4), "theta"=c(7,8,9)),
                                   "sd" = list("N"=c(8), "sigma"=c(8.5), "theta"=matrix(6:11, nrow = 2, ncol = 3)), 
                                   "mean" = list("N"=c(9), "sigma"=c(9.5), "theta"=matrix(6:11, nrow = 2, ncol = 3))))


modeloutputs_wanted <- list("allmodels"=list("simlist"=list("N"=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21), "sigma"=c(1,2,3,4,1,2,3,4,1,2,3,4), "theta"=c(7,8,9,7,8,9,7,8,9)),
                                   "sd" = list("N"=c(6,7,8), "sigma"=c(6.5,8.5,8.5), "theta"=matrix(6:11, nrow = 2, ncol = 3)), 
                                   "mean" = list("N"=c(3,5,9), "sigma"=c(3.5,5.5,9.5), "theta"=matrix(6:11, nrow = 2, ncol = 3))))

theta应该将所有矩阵按行连接起来,就像rowbind()一样,我无法在示例中正确地再现它。

EN

回答 2

Stack Overflow用户

发布于 2022-09-11 11:06:36

这和你要找的东西很接近:

代码语言:javascript
复制
library(purrr)
transpose(modeloutputs) |>
  map(~ transpose(.x)) %>% 
  map_depth(2, ~ if(all(sapply(.x, is.matrix))) unique(.x) else reduce(.x, c))

输出

代码语言:javascript
复制
$simlist
$simlist$N
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
[21] 21

$simlist$sigma
 [1] 1 2 3 4 1 2 3 4 1 2 3 4

$simlist$theta
[1] 7 8 9 7 8 9 7 8 9


$sd
$sd$N
[1] 6 7 8

$sd$sigma
[1] 6.5 8.5 8.5

$sd$theta
$sd$theta[[1]]
     [,1] [,2] [,3]
[1,]    6    8   10
[2,]    7    9   11



$mean
$mean$N
[1] 3 5 9

$mean$sigma
[1] 3.5 5.5 9.5

$mean$theta
$mean$theta[[1]]
     [,1] [,2] [,3]
[1,]    6    8   10
[2,]    7    9   11
票数 0
EN

Stack Overflow用户

发布于 2022-09-11 11:51:27

或在R基:

代码语言:javascript
复制
agg_list <- list()
for(statistic in lapply(modeloutputs, names)[[1]]){
  theta_vec<- c()
  theta <- matrix(ncol=3)
  N_vec<- c()
  sigma_vec<- c()
  for(model in names(modeloutputs)){
    if(statistic == "simlist"){
      theta_vec <- c(theta_vec, modeloutputs[[model]][[statistic]][["theta"]])
      sigma_vec <- c(sigma_vec, modeloutputs[[model]][[statistic]][["sigma"]])
      N_vec <- c(N_vec, modeloutputs[[model]][[statistic]][["N"]])
      stats <-list("N"=N_vec, "sigma"=sigma_vec, "theta"=theta_vec )
    }else{
      theta <- rbind(theta, modeloutputs[[model]][[statistic]][["theta"]])
      theta <- na.omit(theta)
      sigma_vec <- c(sigma_vec, modeloutputs[[model]][[statistic]][["sigma"]])
      N_vec <- c(N_vec, modeloutputs[[model]][[statistic]][["N"]])
      stats <- list("N"=N_vec, "sigma"=sigma_vec, "theta"=theta )
    }
  }
  agg_list <- append(agg_list , list(stats))
}
names(agg_list) <- sapply(modeloutputs, names)[,1]

但无可否认,@Ma l的回答要优雅得多:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73678248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档