我有类似于以下示例的列表
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(.,.)),
您可以编写一个简单的单行递归函数,将两个结构相同的列表的并行成员连接起来,在该函数上调用
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
这是一种方法,但不确定它是否适合您的实际问题。
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