我想在对数据进行分组后使用 dplyr 中的 summarise()
来计算新变量。但是,我希望它对某些数据使用一个方程,对其余数据使用第二个方程。
我曾尝试将 group_by()
和 summarise()
与 if_else()
一起使用,但它不起作用。
这是一个例子。假设——出于某种原因——我想为萼片长度找到一个特殊的值。对于物种“setosa”,这个特殊值是萼片长度平均值的两倍。对于所有其他物种,它只是萼片长度的平均值。这是我试过的代码,但它不适用于 summarise()
library(dplyr)
iris %>%
group_by(Species) %>%
summarise(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))
这个想法适用于
mutate()
,但我需要将 tibble 重新格式化为我正在寻找的数据集。library(dplyr)
iris %>%
group_by(Species) %>%
mutate(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))
这就是我希望生成的 tibble 的布局方式:
library(dplyr)
iris %>%
group_by(Species)%>%
summarise(sepal_mean = mean(Sepal.Length))
# A tibble: 3 x 2
# Species sepal_special
# <fctr> <dbl>
#1 setosa 5.01
#2 versicolor 5.94
#3 virginica 6.59
#>
但我的结果会显示 setosa x 2 的值
# A tibble: 3 x 2
# Species sepal_special
# <fctr> <dbl>
#1 setosa **10.02**
#2 versicolor 5.94
#3 virginica 6.59
#>
建议?我觉得我真的在寻找将
if_else()
与 summarise()
一起使用的方法,但在任何地方都找不到,这意味着必须有更好的方法。谢谢!
最佳答案
在 mutate
步骤之后,使用 summarise
获取每个 'Species' 的 'sepal_special' 的 first
元素
iris %>%
group_by(Species) %>%
mutate(sepal_special = if_else(Species == "setosa",
mean(Sepal.Length)*2, mean(Sepal.Length))) %>%
summarise(sepal_special = first(sepal_special))
# A tibble: 3 x 2
# Species sepal_special
# <fctr> <dbl>
#1 setosa 10.0
#2 versicolor 5.94
#3 virginica 6.59
或者不调用
mutate
,在应用 if_else
后,获取 summarise
中的第一个值iris %>%
group_by(Species) %>%
summarise(sepal_special = if_else(Species == "setosa",
mean(Sepal.Length)*2, mean(Sepal.Length))[1])
# A tibble: 3 x 2
# Species sepal_special
# <fctr> <dbl>
#1 setosa 10.0
#2 versicolor 5.94
#3 virginica 6.59
关于r - 如何将条件汇总为 R 中的单个变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49503539/