我已经问过这个问题了,但没有很好的表现,所以我决定从头再问一次。
我在R中有一个大List对象,包含100个不同模型的输出列表,每个输出本身就是一个包含模型所有参数的统计信息的列表。因此,我有一个子列表的手段,一个为sd,等等,在每一个100输出列表。每个统计数据对于模型的每个参数都有一个向量或矩阵。我想要的是将所有100个列表输出合并到一个大列表中,方法是根据统计数据和参数名称对它们进行聚合。
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()一样,我无法在示例中正确地再现它。
发布于 2022-09-11 11:06:36
这和你要找的东西很接近:
library(purrr)
transpose(modeloutputs) |>
map(~ transpose(.x)) %>%
map_depth(2, ~ if(all(sapply(.x, is.matrix))) unique(.x) else reduce(.x, c))输出
$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发布于 2022-09-11 11:51:27
或在R基:
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的回答要优雅得多:)
https://stackoverflow.com/questions/73678248
复制相似问题