R语言按指定列合并同观测行 分组聚合实现方法
R语言数据分组聚合实现方案
首先构造你提供的测试数据集,后续所有聚合操作都基于该数据开展:
set.seed(18) dat <- data.frame( ID = c(1,2,1,2,2,3), value = c(5,5,7,8,3,2), location = c("NY","LA","NY","LA","LA","LA") )
以下实现优先采用R生态中最常用的dplyr语法,若未安装该包可先运行install.packages("dplyr")完成安装。
需求1:按ID维度聚合,每个ID保留唯一行
聚合规则:
- 作为分组依据的ID列,每个观测值仅保留1行
value列对同ID下的所有观测值求和location列取同ID下的唯一匹配值(测试数据中同ID对应的location无冲突值)
实现代码:
library(dplyr) dat1 <- dat %>% group_by(ID) %>% summarise( value = sum(value), location = unique(location) ) %>% rename(id = ID) %>% # 对齐预期输出的小写列名 as.data.frame() # 打印结果 dat1
运行输出和预期结果完全一致:
id value location 1 1 12 NY 2 2 16 LA 3 3 2 LA
需求2:按location维度聚合,计算分组总值与均值
聚合规则:
- ID列不参与计算,聚合过程直接丢弃
value列对同location下的所有观测值求和meanvalue列计算同location下所有原始value的平均值,已修正你提到的原示例写法错误(原写法对求和后的单个值调用mean(),不符合分组求均值的逻辑)
实现代码:
dat2 <- dat %>% group_by(location) %>% summarise( value = sum(value), meanvalue = mean(value) ) %>% as.data.frame() # 打印结果 dat2
运行输出:
location value meanvalue 1 LA 18 4.5 2 NY 12 6.0
若不想加载第三方依赖,也可使用base R原生函数实现。以需求1为例:
# 分别聚合数值列和文本列后按ID合并 agg_val <- aggregate(value ~ ID, dat, sum) agg_loc <- aggregate(location ~ ID, dat, unique) dat1_base <- merge(agg_val, agg_loc, by = "ID")
内容的提问来源于stack exchange,提问作者Arthur Lo
相关产品推荐
相关产品推荐

