如何在dplyr的summarize()中按ID去重计算聚合统计?
用dplyr实现a列求和+按ID去重计算b列均值
需求说明
- 对数据框的
a列计算所有行的总和 - 对
b列计算均值:同一ID对应的b值仅取一次参与计算;不同ID的b值即使数值重复,也全部纳入均值计算
示例数据
library(dplyr) # 示例1 data1 <- tibble(ID=c("111", "111", "222", "333"), a=c(3,4,5,6), b=c(7,7,8,9)) # 示例2 data2 <- tibble(ID=c("111", "111", "222", "333", "444"), a=c(3,4,5,6,7), b=c(7,7,8,9,7))
解决方案代码
直接在summarize()中完成两个计算:
# 处理示例1 result1 <- data1 %>% summarize( sum_a = sum(a), # 计算a列所有值的总和 mean_b = mean(b[!duplicated(ID)]) # 按ID去重后取对应b值,再求均值 ) # 输出结果 result1 #> # A tibble: 1 × 2 #> sum_a mean_b #> <dbl> <dbl> #> 1 18 8 # 处理示例2 result2 <- data2 %>% summarize( sum_a = sum(a), mean_b = mean(b[!duplicated(ID)]) ) # 输出结果 result2 #> # A tibble: 1 × 2 #> sum_a mean_b #> <dbl> <dbl> #> 1 25 7.75
逻辑说明
sum(a):直接对a列所有行的值求和,完全符合需求;b[!duplicated(ID)]:通过!duplicated(ID)筛选出每个ID的首次出现行,提取这些行的b值——既实现了同一ID的b值只取一次,又保留了不同ID间重复的b值,最后用mean()计算均值。
内容的提问来源于stack exchange,提问作者mcmurphy
相关产品推荐
相关产品推荐

