Как создать таблицу общей частоты, используя dplyr - PullRequest
0 голосов
/ 17 сентября 2018

Я получаю неожиданный результат при использовании dplyr для создания таблицы общей относительной частоты и группировки по двум переменным.Вот пример:

set.seed(1234)
dat1 = data.frame(
  color = c(c(rep("red", 4), rep("green", 4))),
  type = c(c(rep(c(
    "big", "small"
  ), 4))),
  value = sample(1:6, 8, replace = T)
)
dat1 %>% group_by(color, type) %>% summarise(n = n()) %>%
   mutate(total = sum(n), rel.freq = n / total)

Вот результат предыдущего кода:

# A tibble: 4 x 5
# Groups:   color [2]
  color type      n total rel.freq
  <fct> <fct> <int> <int>    <dbl>
1 green big       2     4    0.500
2 green small     2     4    0.500
3 red   big       2     4    0.500
4 red   small     2     4    0.500

Однако я бы ожидал этого:

# A tibble: 4 x 5
# Groups:   color [2]
  color type      n total rel.freq
  <fct> <fct> <int> <int>    <dbl>
1 green big       2     8    0.250
2 green small     2     8    0.250
3 red   big       2     8    0.250
4 red   small     2     8    0.250

Любое пониманиепочему мутирование в трубе dplyr ниже группирует только по первой переменной группировки (или почему она вообще группируется - мое мнение, что она должна работать с набором данных summarise()), было бы очень полезно.

В столбце total должно быть указано, что всего имеется 8 случаев (т. Е. sum(n) из предыдущего результата в summarise() должно = 8).

1 Ответ

0 голосов
/ 17 сентября 2018

После каждого summarise один из элементов группировки будет удален, то есть последняя группа в этом порядке. Нам нужно ungroup после summarise

dat1 %>% 
  group_by(color, type) %>% 
  summarise(n = n()) %>%
  ungroup %>% 
  mutate(total = sum(n), rel.freq = n / total)
# A tibble: 4 x 5
#  color type      n total rel.freq
#  <fct> <fct> <int> <int>    <dbl>
#1 green big       2     8     0.25
#2 green small     2     8     0.25
#3 red   big       2     8     0.25
#4 red   small     2     8     0.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...