如何用R的Reduce函数对列表内子列表的同名元素求和?
R语言列表子元素分别求和的解决方案
你的Reduce代码报错的核心原因:Reduce要求传入的处理函数必须接受两个参数——第一个是累积结果(初始值或上一轮的计算输出),第二个是当前遍历到的列表元素。你定义的函数只有一个参数x,导致R无法传递第二个参数,触发unused argument错误。
正确的Reduce实现方式
我们需要设计一个累积求和的逻辑:每次迭代把当前子列表的right和left值加到累积结果中,同时指定初始值为right和left都为0的列表:
# 定义初始累积值 init_acc <- list(right = 0L, left = 0L) # 执行Reduce累积求和 res <- Reduce( function(acc, curr_item) { list( right = acc$right + curr_item$right, left = acc$left + curr_item$left ) }, x = test, init = init_acc ) # 输出结果 res
运行后会得到目标结构:
$right [1] 1 $left [1] 0
更直观的替代方案
如果不需要刻意使用Reduce,以下两种方法逻辑更简洁:
方案1:Base R原生方法(无需额外包)
通过sapply提取所有子元素后直接求和:
res <- list( right = sum(sapply(test, function(x) x$right)), left = sum(sapply(test, function(x) x$left)) )
方案2:purrr包批量处理(需先安装加载)
purrr的map_dbl可以快速提取数值型元素,再求和:
library(purrr) res <- list( right = test %>% map_dbl("right") %>% sum(), left = test %>% map_dbl("left") %>% sum() )
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

