如何在dplyr的group_by上使用if/ifelse
无论如何要应用条件group_by?例如(顺便说一句,代码不起作用,但它只是为了显示 iris 数据集,以便您了解要点):
iris$Sepal.Width.r <- round(iris$Sepal.Width)
for(i in 1:2){
test <- iris %>%
ifelse(i == 1, group_by(Species), group_by(Sepal.Width.r)) %>% #****
summarise(avgLWdiff = (mean(Petal.Length) - mean(Petal.Width)))
print(test)
}
加星标的行#**** 是我对它应该是什么样子的非常粗略(和错误)的猜测。我认为到目前为止我从其他人那里看到的问题是询问 summarise/mutate 行中的 if 语句,但我还没有看到有人问过 group_by 行。另外,我总结中的内容占了几行。
我想要的输出是:
当 i==1 时:
Species avgLWdiff
<fct> <dbl>
1 setosa 1.22
2 versicolor 2.93
3 virginica 3.53
当我 == 2 时:
Sepal.Width.r avgLWdiff
<dbl> <dbl>
1 2 2.76
2 3 2.76
3 4 1.54
回答
您可以使用if,而不是ifelse. 请记住,这if是用于控制流的,这就是您想要的。
iris %>%
{if(i == 1) group_by(., Species) else group_by(., Sepal.Width.r)} %>%
summarise(avgLWdiff = (mean(Petal.Length) - mean(Petal.Width)))
在这里,我已将if子句放入{},否则管道将尝试放入iris作为测试。通过使用{}magrittr 管道,可以看到更深的点。
用基管做这件事比较困难,因为它不太灵活。我认为你需要定义一个小的辅助函数来让它工作:
f <- function(d){if(i == 1) group_by(d, Species) else group_by(d, Sepal.Width.r)}
iris |> f() |>
summarise(avgLWdiff = (mean(Petal.Length) - mean(Petal.Width)))