R语言按个体分组对多观测amount变量求和生成单行数据集
按个体聚合amount的R实现方案
首先需要注意:示例数据集里的amount列当前是字符类型,直接执行求和会触发报错,必须先转成数值型再做聚合。
基于dplyr的实现(tidyverse生态最常用,可读性最优)
处理数千个个体的规模性能完全够用,输出结果就是每个个体一行的标准dataframe:
library(dplyr) agg_df <- d %>% # 把字符型amount转成数值型 mutate(amount = as.numeric(amount)) %>% # 按individual字段分组 group_by(individual) %>% # 计算每个个体的amount总和,自动解除分组避免后续操作异常 summarise(total_amount = sum(amount), .groups = "drop")
基于base R的原生实现(无需加载任何第三方包)
适合不想依赖外部扩展包的场景,用R自带函数就能完成聚合:
# 转换amount的类型为数值 d$amount <- as.numeric(d$amount) # 用公式语法指定分组列和待聚合列 agg_base <- aggregate(amount ~ individual, data = d, FUN = sum) # 调整列名,提升结果可读性 colnames(agg_base)[2] <- "total_amount"
基于data.table的实现(适合更大规模的数据场景)
如果后续数据量持续增长,该方案的运行效率优势会更明显:
library(data.table) dt <- as.data.table(d) # 单链完成类型转换、分组、全量聚合 agg_dt <- dt[, amount := as.numeric(amount)][ , .(total_amount = sum(amount)), by = individual ]
之前尝试pivot_wider的适配性说明
pivot_wider的核心作用是把长表的多行观测拆成独立的宽表列,适合需要逐行保留每一条原始观测值的场景;而你的需求是对同一individual对应的多个amount值做汇总压缩,直接分组求和的逻辑完全匹配要求的粒度,不需要走宽表转换的路径。
内容的提问来源于stack exchange,提问作者kerryp。
相关产品推荐
相关产品推荐

