如何使用dplyr在R中按分组计算两列唯一值的SUMPRODUCT(类Excel功能)
解决dplyr实现Excel SUMPRODUCT(分组唯一值乘积和)的问题
看起来你需要的是按dem_sect分组后,计算每组中area和kg_med唯一配对的乘积之和,再将这个结果映射到该组的每一行中。从你的示例数据来看,每个area对应的kg_med是唯一的,所以我们只需要先提取每组的唯一配对,再计算乘积总和即可。
解决方案代码
首先确保你已经加载了dplyr包,然后运行以下代码:
library(dplyr) # 你的原始数据框 df <- structure(list(dem_sect = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("AB", "EP", "FE", "MF", "PA"), class = "factor"), cod_estr = c("a", "a", "b", "b", "c", "b", "b", "b", "a", "b", "c", "b", "b", "a", "b", "c", "c", "b", "c"), sect_estr = structure(c(10L, 10L, 11L, 11L, 12L, 11L, 11L, 11L, 10L, 11L, 12L, 11L, 11L, 10L, 11L, 12L, 12L, 11L, 12L), .Label = c("ABa", "ABb", "ABc", "EPa", "EPb", "EPc", "FEa", "FEb", "FEc", "MFa", "MFb", "MFc", "PAa", "PAb", "PAc"), class = "factor"), area = c(14L, 14L, 24L, 24L, 11L, 24L, 24L, 24L, 14L, 24L, 11L, 24L, 24L, 14L, 24L, 11L, 11L, 24L, 11L), kg_med = c(5.88125, 5.88125, 6.8505, 6.8505, 3.0852, 6.8505, 6.8505, 6.8505, 5.88125, 6.8505, 3.0852, 6.8505, 6.8505, 5.88125, 6.8505, 3.0852, 3.0852, 6.8505, 3.0852)), class = "data.frame", row.names = c(NA, -19L)) # 计算分组唯一值乘积和并添加新列 df <- df %>% group_by(dem_sect) %>% mutate( sumprod = { # 提取当前组中area和kg_med的唯一配对 unique_pairs <- distinct(cur_data(), area, kg_med) # 计算乘积之和 sum(unique_pairs$area * unique_pairs$kg_med) } ) %>% ungroup() # 可选:将结果四舍五入到两位小数,匹配你的预期值 df <- df %>% mutate(sumprod = round(sumprod, 2))
代码解释
group_by(dem_sect):按dem_sect字段分组,确保每组独立计算cur_data():获取当前分组的数据集,避免引用整个数据框产生的问题distinct(area, kg_med):提取每组中area和kg_med的唯一组合,确保同一配对不会重复计算sum(unique_pairs$area * unique_pairs$kg_med):计算这些唯一配对的乘积总和mutate:将计算得到的总和作为新列sumprod添加到原数据框中,组内每一行都会获得相同的总和值round(sumprod, 2):可选步骤,将结果四舍五入到两位小数,得到你预期的280.69
验证结果
运行代码后,你的sumprod列值会是280.69(四舍五入后),和Excel计算的结果一致。对于你61000行的数据集,这个方法的效率也很高,因为分组和去重操作在dplyr中都是优化过的。
内容的提问来源于stack exchange,提问作者Juan Carlos
相关产品推荐
相关产品推荐

