如何在dplyr的group_by中使用if/ifelse实现条件分组?
R dplyr 条件化group_by实现方案
错误原因
你原有代码中使用的ifelse是向量化运算函数,返回结果为等长向量,无法直接在dplyr管道中返回分组对象,因此会运行报错。
可直接运行的修正方案
方案1:管道内嵌套if-else判断(最贴近原有写法)
用大括号包裹判断逻辑,用.指代管道传入的数据集即可:
# 先加载依赖包 library(dplyr) # 构造示例字段 iris$Sepal.Width.r <- round(iris$Sepal.Width) for(i in 1:2){ test <- iris %>% {if(i == 1) group_by(., Species) else group_by(., Sepal.Width.r)} %>% summarise(avgLWdiff = mean(Petal.Length) - mean(Petal.Width)) print(test) }
方案2:非标准求值传参(适合多分组字段扩展场景)
通过rlang的符号转换逻辑,直接把条件判断得到的字段名传入group_by:
library(dplyr) iris$Sepal.Width.r <- round(iris$Sepal.Width) for(i in 1:2){ test <- iris %>% group_by(!!if(i == 1) sym("Species") else sym("Sepal.Width.r")) %>% summarise(avgLWdiff = mean(Petal.Length) - mean(Petal.Width)) print(test) }
两种方案的运行结果完全匹配你给出的预期输出,且后续summarise无论包含多少行计算逻辑,都可以直接沿用普通dplyr的写法,不需要额外调整。
内容的提问来源于stack exchange,提问作者eyy
相关产品推荐
相关产品推荐

