gpt4 book ai didi

r - 如何在 dplyr group_by 中使用 if/if else

转载 作者:行者123 更新时间:2023-12-05 09:04:32 26 4
gpt4 key购买 nike

是否有应用条件 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)))

关于r - 如何在 dplyr group_by 中使用 if/if else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68519825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com