Предположим, что у меня есть df
вот так:
df <- tribble(
~Country, ~Gender, ~var,
"Bangladesh", "F", 2.5,
"Bangladesh", "M", 4.5,
"Bangladesh", "M", 4.1,
"US", "F", 1.7,
"US", "F", 2.7,
"US", "M", 3.5,
)
Мы можем легко и отдельно выполнить следующую задачу:
один для группировки на основе Country
и Gender
df %>%
group_by(Country, Gender) %>%
reframe(
n = n(),
meanVar = mean(var))
и другой, если мы хотим знать общие значения в каждой стране:
df %>%
group_by(Country) %>%
reframe(
n = n(),
meanVar = mean(var))
но мне было интересно, можем ли мы получить вывод, в котором у нас есть три строки сводной статистики для каждой страны: F
, M
и All
для всех женщин и мужчин в каждой стране.
Мы можем использовать bind_rows()
и сначала изменить Gender
на "All"
, а затем сгруппировать по Country
и Gender
:
library(dplyr)
df %>%
mutate(Gender = "All") %>%
bind_rows(., df) %>%
group_by(Country, Gender) %>%
summarise(n = n(),
meanVar = mean(var))
#> # A tibble: 6 × 4
#> # Groups: Country [2]
#> Country Gender n meanVar
#> <chr> <chr> <int> <dbl>
#> 1 Bangladesh All 3 3.7
#> 2 Bangladesh F 1 2.5
#> 3 Bangladesh M 2 4.3
#> 4 US All 3 2.63
#> 5 US F 2 2.2
#> 6 US M 1 3.5
Данные из ОП
df <- tribble(
~Country, ~Gender, ~var,
"Bangladesh", "F", 2.5,
"Bangladesh", "M", 4.5,
"Bangladesh", "M", 4.1,
"US", "F", 1.7,
"US", "F", 2.7,
"US", "M", 3.5,
)
Created on 2023-04-02 with reprex v2.0.2
Хороший хак. У меня часто бывают похожие варианты использования, и мне никогда не приходило в голову, что самым простым способом было бы добавить «итого» к фрейму данных перед группировкой.
Это хороший трюк, но с большим количеством групп я предпочитаю сетки без данных. Я связал недавнее сообщение в блоге в комментариях к ОП.
В недавней записи блога я рассказываю об этом и других проблемах, возникающих при работе с вложенными
data.frame
.