dplyr条件汇总函数报错:按物种选择不同汇总方式实现失败
解决按条件选择不同汇总函数的问题
嘿,我懂你碰到的这个坑了——用case_when在summarise里这么写确实会出问题,原因是case_when是逐行判断并返回值,但summarise需要的是每组输出一个汇总结果,两者的逻辑不匹配。
问题分析
你原来的代码里,分组后每组有50行数据,case_when会对每一行的Species做判断,然后返回50个sum或mean的结果(其实是把同一个汇总值重复50次),但summarise要求每组只输出一个值,这就会导致报错或者结果不符合预期。
正确的实现方法
这里有两种简单的解决方案:
方法1:用if_else替代case_when
因为分组后每组的Species是唯一的,所以用if_else可以直接针对每组的条件选择汇总函数:
iris <- tibble::as_tibble(iris) iris %>% group_by(Species) %>% summarise(pwz = if_else(Species == "setosa", sum(Petal.Width, na.rm = TRUE), mean(Petal.Width, na.rm = TRUE)))
这个方法简洁高效,适合单条件判断的场景。
方法2:拆分数据分别处理再合并
如果后续有更复杂的多条件判断,拆分处理会更清晰:
library(dplyr) # 单独处理setosa iris_setosa <- iris %>% filter(Species == "setosa") %>% summarise(Species = "setosa", pwz = sum(Petal.Width, na.rm = TRUE)) # 处理其他物种 iris_other <- iris %>% filter(Species != "setosa") %>% group_by(Species) %>% summarise(pwz = mean(Petal.Width, na.rm = TRUE)) # 合并结果 bind_rows(iris_setosa, iris_other)
两种方法都能得到你想要的结果:setosa组返回Petal.Width的总和,其他组返回均值。
内容的提问来源于stack exchange,提问作者michdn
相关产品推荐
相关产品推荐

