/ / Jak podsumowuje się warunki w jednej zmiennej w R? - r, dplyr

Jak można podsumować warunkami w jedną zmienną w R? - r, dplyr

Chciałbym użyć summarise() z dplyr po zgrupowaniu danych w celu obliczenia nowej zmiennej. Chciałbym jednak użyć jednego równania dla niektórych danych i drugiego równania dla pozostałych danych.

Próbowałem użyć group_by() i i summarise() z if_else() ale to nie działa.

Oto przykład. Powiedzmy - z jakiegoś powodu - chciałem znaleźć specjalną wartość dla długości sepal. Dla gatunku „setosa” ta specjalna wartość jest dwa razy większa od średniej długości sepal. Dla wszystkich innych gatunków jest to po prostu oznacza długość sepal. To jest kod, którego próbowałem, ale nie działa summarise()

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

Ten pomysł działa z mutate() ale musiałbym ponownie sformatować tibble, aby był zestawem danych, którego szukam.

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

Oto jak chcę ułożyć wynikowy 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
#>

Ale mój wynik pokazałby wartość dla 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
#>

Propozycje? Mam wrażenie, że naprawdę szukałem sposobów użycia if_else() z summarise() ale nie można go nigdzie znaleźć, co oznacza, że ​​musi istnieć lepszy sposób.

Dzięki!

Odpowiedzi:

2 dla odpowiedzi № 1

Po mutate krok, użyj summarise aby uzyskać first element „sepal_special” dla każdego „gatunku”

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

Lub zamiast dzwonić na mutate, po if_else zostanie zastosowana, pobierz pierwszą wartość w 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 dla odpowiedzi nr 2

Inna opcja: ponieważ dwukrotność średniej jest równa średniej dwukrotności wartości, możesz podwoić długości sepal dla setosa, a następnie podsumować:

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