【发布时间】:2017-10-13 14:39:58
【问题描述】:
我想计算一组值相对于其余组的相对频率。例如,计算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
现在,它给出了不同的输出。可能是什么原因?
【问题讨论】:
-
好吧,summary 中的
sum(N)的总和值比 mutate 少,因此第二次尝试的值要小得多。您可以在最后一行尝试mutate(freq = N / sum(unique(N))),但这不是很安全 -
group_by(am)不会限制它仅在该组中计数吗?sum(unique(N))错过了真正的重复,我的意思是同样频繁的am-gear组合。随着数量的增加,即使这个值的份额也线性增加。所以,我认为它对相对频率计算没有影响。 -
确实如此。但是您的小组现在更大了,因为是变异而不是汇总的结果。它对 rel.freq 产生影响的原因。是因为你的
N在这两种情况下都是一样的