2017-10-13 23 views
0

我想计算相对于其余组的相对频率的一组值。例如,计算am==0gear==3的相对频率。我使用以下方式计算。incurbtent相对频率输出与总结和变异

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 

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

+1

那么,sum(N)总结的总和比mutate小,因此第二次尝试的值要小得多。你可以在最后一行尝试'mutate(freq = N/sum(unique(N)))'但它不是很安全 – Sotos

+0

'group_by(am)'不会限制它只在该组中进行计数? 'sum(unique(N))'错过了真正的重复,我的意思是频繁的'am-gear'组合。随着数量的增加,即使这个数值的份额线性增加。所以,我认为它在相对频率计算中没有区别。 – Prradep

+0

它的确如此。但是你们的小组现在变得更大,因为它们是变异而不是总结的结果。它在rel.freq中有所不同的原因。是因为你的'N'在两种情况下都是一样的 – Sotos

回答

2

您需要重新计算的N个大小为AM组以及:

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

这样可以得到预期的结果

3

一个更好的选择是left_join与总的输出(“水库”)

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

如果我们看一下sum(N)实在是有点较大的值,因为有更多的行数

+0

我很感谢你的回答。但是,我基本上想知道那里出了什么问题并理解。就我个人而言,我不想为此操作创建另一个对象'res'。 – Prradep

+0

@Prradep假设有100行,我们在每个组的第二个案例中总结了所有元素的数量,但第一种方法只有几行 – akrun

+0

随着数量的增加,即使这个值的份额线性增加。所以,我认为它在相对频率计算中没有区别。 – Prradep