我想计算一组值相对于其余组的相对频率。例如,计算gear==3
中am==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
现在,它提供了不同的输出。可能是什么原因?
答案 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())
这会得到预期的结果