You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:45:02