在R语言中对嵌套列表进行逐元素求平均
R语言嵌套列表逐元素求平均方案
示例数据
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)) )
方法一:使用purrr包(简洁高效)
利用purrr::transpose将相同位置的元素分组,再递归计算平均值,保留原嵌套结构:
library(purrr) # 转置嵌套列表,把对应位置的元素归为一组 transposed_lst <- transpose(example) # 递归处理每个分组 avg_list <- map(transposed_lst, function(group) { if (is.list(group[[1]])) { map(transpose(group), ~ mean(unlist(.x))) } else { mean(unlist(group)) } })
方法二:Base R递归函数(无需额外包)
自定义递归函数,遍历嵌套结构并逐元素计算平均:
avg_nested <- function(lst) { if (is.numeric(lst[[1]])) { # 数值元素直接计算平均 Reduce(function(a, b) a + b, lst) / length(lst) } else { # 子列表递归处理,保留原命名 lapply(setNames(names(lst[[1]]), names(lst[[1]])), function(nm) { avg_nested(lapply(lst, `[[`, nm)) }) } } avg_list <- avg_nested(example)
结果说明
最终得到的avg_list与原列表结构完全一致,部分关键计算结果如下:
avg_list$A:10avg_list$B$H:103.6667avg_list$B$G:c(0.9, 3.3333)avg_list$C:c(12.6667, 23.3333)
内容的提问来源于stack exchange,提问作者domath
相关产品推荐
相关产品推荐

