如何对嵌套列表中同名元素求和?R语言实现方案求助
解决嵌套列表中重复键的求和问题
看起来你遇到的问题是因为aggregate的用法不太适配这种带重复名字的列表结构。让我一步步给你拆解解决方案:
为什么你的代码会报错?
当你把子列表直接传给aggregate时,它会默认把列表的每个元素当成数据框的一列,而by = list(names(l))是一个长度等于子列表元素个数的向量,两者结构不匹配,所以会抛出长度不一致的错误。我们需要先把每个子列表转换成“键-值”的成对结构,再进行分组求和。
基础R解决方案(不需要额外包)
这里我们用unlist把子列表转成带名字的向量,然后用tapply按名字分组求和,最后转回列表格式:
# 你的原始数据(注意R允许列表有重复名字,unlist后会保留所有元素) sample <- list( "element1" = list("term1"=0.5, "term2"=1, "term3"= 4, "term1"= 0.5), "element2" = list("term23"=5, "term1"=2, "term23"=4) ) # 处理逻辑 result <- lapply(sample, function(l) { # 把子列表转成带名字的向量 vec <- unlist(l) # 按名字分组求和 summed_values <- tapply(vec, names(vec), sum) # 转回列表格式 as.list(summed_values) }) # 查看结果 result # $element1 # $element1$term1 # [1] 1 # # $element1$term2 # [1] 1 # # $element1$term3 # [1] 4 # # # $element2 # $element2$term1 # [1] 2 # # $element2$term23 # [1] 9
tidyverse风格解决方案(更直观)
如果你习惯用dplyr这类工具,也可以用数据框的方式处理,逻辑更清晰:
library(dplyr) result <- lapply(sample, function(l) { # 把子列表转换成数据框,包含term和value两列 tibble(term = names(l), value = unlist(l)) %>% # 按term分组求和 group_by(term) %>% summarise(total = sum(value)) %>% # 把数据框转回带名字的向量,再转成列表 deframe() %>% as.list() })
两种方法都能得到你想要的desired_output,可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者WinterMensch
相关产品推荐
相关产品推荐

