如何在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)))


以上是如何在dplyr的group_by上使用if/ifelse的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>