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

dplyr中summarise搭配case_when分组汇总后出现重复行如何解决?

底层原因

这个问题的核心是case_when的向量运算规则和summarise的返回逻辑不匹配:

  1. case_when是逐元素运算的向量函数,返回值的长度和输入的判断条件向量长度完全一致。你在分组后每个grp组内有3行数据,grp == "g4"这个判断会生成长度为3的逻辑向量,虽然sum(x)、weighted.mean(x,w)本身都是返回长度为1的标量,但R会自动将标量广播为和判断向量等长的重复值(也就是每个组返回3个相同的计算结果)。
  2. summarise的规则是:如果汇总表达式返回长度为n的向量,每个分组就输出n行。你直接使用单一汇总函数时,返回值长度为1,所以每个组仅输出1行,总共4行符合预期;套入case_when后每个组返回长度为3的向量,最终输出4*3=12行重复数据。

正确解决方法

核心思路是让判断条件仅返回长度为1的标量,避免广播生成重复值,常用有两种实现方案:

方案1:使用标量判断的if分支

分组后每个组的grp唯一,取第一个值做标量判断即可:

df %>%
  group_by(grp) %>%
  summarize(
    value = if (first(grp) == "g4") sum(x) else weighted.mean(x, w),
    .groups = "drop"
  )

方案2:调整case_when的判断条件为标量

用cur_group()获取当前分组信息,或者取分组列第一个值,让判断条件长度为1:

df %>%
  group_by(grp) %>%
  summarize(
    value = case_when(
      cur_group()$grp == "g4" ~ sum(x),
      TRUE ~ weighted.mean(x, w)
    ),
    .groups = "drop"
  )

两种方案的输出均为4行,g4分组返回sum(x)的结果15839,其余分组返回加权均值,完全符合需求,不需要额外用distinct去重。


内容的提问来源于stack exchange,提问作者hmhensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:54:05