对 R 中的嵌套列表求平均值

问题描述 投票:0回答:2

我有类似于以下示例的列表

example <- list(
  list(A = 10, B = list(H = 110, E = 211, G = c(1.4,2)), C = c(13,24)),
  list(A = 15, B = list(H = 100, E = 201, G = c(0.1,5)), C = c(11,25)),
  list(A = 5,  B = list(H = 101, E = 221, G = c(1.2,3)), C = c(14,21))
)

这些列表的形状相同,并且都是数字。我想按元素对它们进行平均并将平均值保存在同一列表中

list(A = . , B = list(H = . , E = . , G = c(.,.)), C = c(.,.)),
r list lapply nested-lists sapply
2个回答
1
投票

您可以编写一个简单的单行递归函数,将两个结构相同的列表的并行成员连接起来,在该函数上调用

Reduce
,并将列表作为操作数,然后
rapply
获取平均值:

group_c <- function(a, b) if(!is.list(a))  c(a, b) else Map(group_c, a, b)
rapply(Reduce(group_c, example), mean, how = "list")
#> $A
#> [1] 10
#> 
#> $B
#> $B$H
#> [1] 103.6667
#> 
#> $B$E
#> [1] 211
#> 
#> $B$G
#> [1] 2.116667
#> 
#> 
#> $C
#> [1] 18

创建于 2023-07-31,使用 reprex v2.0.2


0
投票

这是一种方法,但不确定它是否适合您的实际问题。

library(rlist) # to use list.unzip

example <- list(
  p1 = list(A = 10, B = list(H = 110, E = 211, G = c(1.4,2)), C = c(13,24)),
  p2 = list(A = 15, B = list(H = 100, E = 201, G = c(0.1,5)), C = c(11,25)),
  p3 = list(A = 5,  B = list(H = 101, E = 221, G = c(1.2,3)), C = c(14,21))
)

u <- list.unzip(example)
u$B <- apply(u$B, 1L, simplify2array)

Mean <- function(x) {
  if(is.matrix(x)) {
    rowMeans(x)
  } else {
    mean(x)
  }
}

rapply(u, Mean, how = "replace")
# $A
# [1] 10
# 
# $B
# $B$H
# [1] 103.6667
# 
# $B$E
# [1] 211
# 
# $B$G
# [1] 0.900000 3.333333
# 
# 
# $C
# [1] 12.66667 23.33333
© www.soinside.com 2019 - 2024. All rights reserved.