/ / Comment résume-t-on des conditions en une seule variable dans R? - r, dplyr

Comment résume-t-on des conditions en une seule variable dans R? - r, dplyr

Je voudrais utiliser summarise() à partir de dplyr après le regroupement des données pour calculer une nouvelle variable. Mais j'aimerais qu'il utilise une équation pour certaines des données et une seconde pour le reste des données.

J'ai essayé d'utiliser group_by() et et summarise() avec if_else() mais ça ne marche pas.

Voici un exemple. Disons - pour une raison quelconque - je voulais trouver une valeur spéciale pour la longueur des sépales. Pour l’espèce "setosa", cette valeur spéciale est le double de la moyenne de la longueur des sépales. Pour toutes les autres espèces, il s’agit simplement de la C'est le code que j'ai "essayé", mais il ne fonctionne pas avec summarise()

library(dplyr)
iris %>%
group_by(Species) %>%
summarise(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))

Cette idée fonctionne avec mutate() mais il me faudrait reformater le tibble pour qu'il soit l'ensemble de données que je recherche.

library(dplyr)
iris %>%
group_by(Species) %>%
mutate(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))

Voici comment je veux que le tibble résultant soit aménagé:

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
#>

Mais mon résultat montrerait la valeur pour 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
#>

Suggestions? Je sens que j’ai vraiment cherché des façons d’utiliser if_else() avec summarise() mais ne peut pas le trouver n'importe où, ce qui signifie qu'il doit y avoir un meilleur moyen.

Merci!

Réponses:

2 pour la réponse № 1

Après le mutate step, use summarise pour obtenir le first élément de "sepal_special" pour chaque "espèce"

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

Ou au lieu d'appeler le mutate, après le if_else est appliqué, obtenez la première valeur en 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 pour la réponse № 2

Une autre option: étant donné que deux fois la moyenne est identique à la moyenne de deux fois les valeurs, vous pouvez doubler la longueur des sépales pour setosa puis résumer:

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