具有总结和变异的不存在的相对频率输出

时间:2017-10-13 14:39:58

标签: r dplyr

我想计算一组值相对于其余组的相对频率。例如,计算gear==3am==0的相对频率。我使用以下方式计算。

library(dplyr)

mtcars %>% 
  select(am, gear) %>% 
  group_by(am, gear) %>% 
  summarise(N = n()) %>%
  group_by(am) %>% 
  mutate(freq = N / sum(N))

# Source: local data frame [4 x 4]
# Groups: am [2]
# 
# # A tibble: 4 x 4
#     am  gear     N      freq
#   <dbl> <dbl> <int>     <dbl>
# 1     0     3    15 0.7894737
# 2     0     4     4 0.2105263
# 3     1     4     8 0.6153846
# 4     1     5     5 0.3846154

以上输出符合预期。但是,我希望freq值作为原始数据集中具有相同值的新列。我尝试了以下方法来计算计数Ǹ,然后计算相对频率freq

mtcars %>% 
  select(am, gear) %>% 
  group_by(am, gear) %>% 
  mutate(N = n()) %>%
  group_by(am) %>% 
  mutate(freq = N / sum(N))

# Source: local data frame [32 x 4]
# Groups: am [2]
# 
# # A tibble: 32 x 4
#      am  gear     N       freq
#   <dbl> <dbl> <int>      <dbl>
# 1     1     4     8 0.08988764
# 2     1     4     8 0.08988764
# 3     1     4     8 0.08988764
# 4     0     3    15 0.06224066
# 5     0     3    15 0.06224066
# 6     0     3    15 0.06224066
# 7     0     3    15 0.06224066
# 8     0     4     4 0.01659751
# 9     0     4     4 0.01659751
# 10     0     4     4 0.01659751
# # ... with 22 more rows

现在,它提供了不同的输出。可能是什么原因?

2 个答案:

答案 0 :(得分:3)

更好的选项是left_join,其中包含汇总输出(&#39; res&#39;)

mtcars %>%
        select(am, gear) %>%
        left_join(., res)

如果我们查看sum(N)它会有更大的值,因为行数更多

答案 1 :(得分:2)

您还需要重新计算am组的N大小:

mtcars %>% 
  select(am, gear) %>% 
  group_by(am, gear) %>% 
  mutate(N = n()) %>% 
  group_by(am) %>% 
  mutate(freq = N / n())

这会得到预期的结果