Как суммировать значения в соответствии с различными значениями, а затем агрегировать их?

#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