为何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
相关产品推荐
相关产品推荐

