如何使用dplyr

时间:2018-09-17 14:54:58

标签: r group-by dplyr

使用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 :(得分:3)

在每个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