You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中嵌套列表对应元素求和的通用实现方法

嵌套列表对应元素求和的通用实现

问题场景

给定结构一致的嵌套列表(每个子列表包含相同名称的元素,且元素为长度相同的向量),需要计算所有子列表中对应位置元素的和(如a1 + b1 + c1 + ...、a2 + b2 + c2 + ...),且子列表数量不固定。

解决方案1:基础R实现(无需额外包)

利用do.call将列表元素批量传递给mapply,结合rowSums完成对应向量的逐元素求和:

# 定义嵌套列表示例
foo <- list(
  a = list("a1" = c(1,2,3), "a2" = c(4,5,6), "a3" = c(7,8,9)),
  b = list("b1" = c(10, 20, 30), "b2" = c(40, 50, 60), "b3" = c(70, 80, 90)),
  c = list("a1" = c(100,200,300), "a2" = c(400,500,600), "a3" = c(700,800,900))
)

# 通用求和脚本
sum_result <- do.call(mapply, c(function(...) rowSums(cbind(...)), foo, SIMPLIFY = FALSE))

# 查看结果
sum_result

说明:

  • do.call(mapply, ...) 将foo的每个子列表作为独立参数传入mapply
  • 匿名函数中,cbind(...)把对应位置的向量拼接成矩阵,rowSums计算每行的和(即向量逐元素相加)
  • SIMPLIFY = FALSE 确保结果保持列表结构,避免自动转换为矩阵

解决方案2:用purrr包简化代码(更直观)

借助purrr的transpose转置嵌套列表,再用reduce累加每个分组的元素:

library(purrr)

# 转置列表后逐组求和
sum_result <- foo %>% 
  transpose() %>%  # 转置后,原列表的a1、b1、c1会被归为同一组
  map(~ reduce(.x, `+`))  # 对每个组的向量依次累加求和

说明:

  • transpose(foo) 把嵌套列表的层级反转,从「子列表-元素」转为「元素-子列表对应值」
  • map(reduce(.x, +)) 对每个元素组(如a1组包含a$a1、b$a1、c$a1)执行累加操作

结果示例

两种方法都会得到相同的输出:

$a1
[1] 111 222 333

$a2
[1] 444 555 666

$a3
[1] 777 888 999

内容的提问来源于stack exchange,提问作者ACE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:07:51