R中使用dplyr的group_by()分组后如何选取单条数据行汇总
正确实现代码
library(dplyr) S1 <- score %>% # 计算权重与加权得分 mutate( Weight = ifelse(category %in% 1:4, 0.125, 0.5), WRes = Weight * result ) %>% # 按id、interval、category分组,每个组仅保留1行去重 group_by(id, interval, category) %>% slice_head(n = 1) %>% # 回到id+interval维度求和 group_by(id, interval) %>% summarise(SWRes = sum(WRes), .groups = "drop")
运行后输出结果如下:
# A tibble: 4 × 3 id interval SWRes <dbl> <dbl> <dbl> 1 1 1 91 2 1 2 74.5 3 2 1 81.5 4 2 2 87
所有结果均≤100,符合要求。
原有代码错误说明
- 第一次尝试在管道中直接调用
score[!duplicated(score$category), ],读取的是原始未处理的score数据,没有沿用管道上游的计算结果,且是全局对category去重,仅会保留前5条不同类别的数据,完全不符合分组去重的需求。 - 第二次尝试
filter(row_number() == 1)仅会保留每个id+interval分组的第一条数据,每个组最终仅1行,无法凑齐5个类别的数据求和;同时代码缺少管道符%>%连接filter和summarize,存在语法错误。
实现逻辑说明
- 用
group_by(id, interval, category)将去重单元定位到「同一用户、同一区间、同一类别」,每个单元下的重复数据用slice_head(n=1)取第一条即可,也可以替换为distinct(id, interval, category, .keep_all = TRUE)实现相同效果。 - 去重后重新按
id+interval分组求和,每个组刚好包含5个类别的单条数据,权重总和为1,计算结果自然≤100。 - 注意R变量名大小写敏感,需注意
WRes的拼写统一。
内容的提问来源于stack exchange,提问作者Tamimi
相关产品推荐
相关产品推荐

