我想在分组数据后使用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)))
这就是我想要产生的结果:
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()
一起使用的方法,但无法在任何地方找到它,这意味着必须有更好的方法。
谢谢!
答案 0 :(得分:2)
在mutate
步骤之后,使用summarise
为每个'物种'获取'first
元素'sepal_special'
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
答案 1 :(得分:1)
另一个选择:因为平均值的两倍与值的两倍的平均值相同,你可以将setosa的萼片长度加倍,然后总结:
iris %>%
mutate(Sepal.Length = ifelse(Species == "setosa", 2*Sepal.Length, Sepal.Length)) %>%
group_by(Species) %>%
summarise(sepal_special = mean(Sepal.Length))
# A tibble: 3 x 2
Species sepal_special
<fct> <dbl>
1 setosa 10.0
2 versicolor 5.94
3 virginica 6.59