#r #dplyr
Вопрос:
Я пытаюсь обобщить ценности по разным группам.
Вот мой пример ниже.
Есть ли способ получить ожидаемый результат более надежным способом ?
Заранее большое спасибо !
library(dplyr)
tab1 <- starwars %>%
slice(1:8) %>%
group_by(eye_color,sex) %>%
summarise(value=sum(mass,na.rm = T)) %>%
ungroup()
tab2 <- tab1 %>%
group_by(eye_color) %>%
summarise(pourcentage=round(value/sum(value)*100,1))
# What I want
tibble(
eye_color = tab1$eye_color,
sex = tab1$sex,
value = tab1$value,
pourcentage = tab2$pourcentage,
)
# A tibble: 6 x 4
eye_color sex value pourcentage
<chr> <chr> <dbl> <dbl>
1 blue female 75 27.6
2 blue male 197 72.4
3 brown female 49 100
4 red none 64 100
5 yellow male 136 64.5
6 yellow none 75 35.5
Ответ №1:
summarise
по умолчанию отбрасывается один уровень группировки, поэтому вы можете добавить a mutate
после первого summarise
, чтобы рассчитать процент.
library(dplyr)
starwars %>%
slice(1:8) %>%
group_by(eye_color,sex) %>%
summarise(value=sum(mass,na.rm = T)) %>%
mutate(percentage = round(prop.table(value) * 100, 1)) %>%,
#prop.table is same as value/sum(value)
#percentage=round(value/sum(value)*100,1)) %>%
ungroup
# eye_color sex value percentage
# <chr> <chr> <dbl> <dbl>
#1 blue female 75 27.6
#2 blue male 197 72.4
#3 brown female 49 100
#4 red none 64 100
#5 yellow male 136 64.5
#6 yellow none 75 35.5
Комментарии:
1. Потрясающе, я не знал группового поведения
summarise