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

为何dplyr的summarise中sum统计字符向量结果与base R不一致

你对dplyr summarise()的求值规则认知有误,summarise()和mutate()一样支持同语句块内按从左到右的顺序引用前面新定义的变量,并非只有mutate()才有这个特性。

问题具体原因

你在summarise()中先定义了一个与原始列重名的新列Pass,赋值后同语句块内后续的Pass标识符都会优先指向这个新生成的数值列,而非原始的字符列:

  • 计算Pass=sum(Pass=="Pass")时,引用的还是原始字符列,结果是每个分组的Pass数量,为数值型
  • 后续计算Fail=sum(Pass=="Fail")时,Pass已经是数值型的统计结果,和字符串"Fail"比较全部返回FALSE,求和结果为0,因此和base R的统计结果不一致。

修复方案

修改新列名避免与原始列重名即可,示例代码如下:

Pass_summary <- df %>% 
  group_by(Letters) %>% 
  summarise(
    n = n(), 
    pass_num = sum(Pass == "Pass"), 
    fail_num = sum(Pass == "Fail")
  )

你可以运行下面的代码验证summarise的同阶段变量引用特性:

# 测试summarise同阶段变量引用特性
test_df <- data.frame(val = c(2,4,6,8))
test_df %>% 
  summarise(
    total = sum(val), # 基于原始val计算总和为20
    double_total = total * 2 # 直接引用前面生成的total,结果为40
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:05