【问题标题】:incosistent relative frequency outputs with summarise and mutate具有汇总和变异的相对频率输出不一致
【发布时间】:2017-10-13 14:39:58
【问题描述】:

我想计算一组值相对于其余组的相对频率。例如,计算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

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

【问题讨论】:

  • 好吧,summary 中的 sum(N) 的总和值比 mutate 少,因此第二次尝试的值要小得多。您可以在最后一行尝试mutate(freq = N / sum(unique(N))),但这不是很安全
  • group_by(am) 不会限制它仅在该组中计数吗? sum(unique(N)) 错过了真正的重复,我的意思是同样频繁的 am-gear 组合。随着数量的增加,即使这个值的份额也线性增加。所以,我认为它对相对频率计算没有影响。
  • 确实如此。但是您的小组现在更大了,因为是变异而不是汇总的结果。它对 rel.freq 产生影响的原因。是因为你的N 在这两种情况下都是一样的

标签: r dplyr


【解决方案1】:

更好的选择是 left_join 与汇总输出 ('res')

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

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

【讨论】:

  • 感谢您的回答。但是,我基本上想知道那里出了什么问题并理解。就个人而言,我不想为此操作创建另一个对象res
  • @Prradep 假设有 100 行,我们在第二种情况下对每个组的元素总数求和,但第一种方法只有几行
  • 随着数量的增加,甚至这个值的份额也呈线性增加。所以,我认为它对相对频率计算没有影响。
  • 没有。在这两种情况下,您的 N 仍然相同。所以在一种情况下,你正在做N / 3,而在另一种情况下,N / 10...我认为最安全的方法是按照 akrun 的建议进行合并
  • @Prradep 是的,你可以做到%&gt;%right_join(., mtcars %&gt;% select(am, gear))
【解决方案2】:

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

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

这得到了预期的结果

【讨论】:

    猜你喜欢
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2021-03-09
    • 1970-01-01
    • 2021-08-20
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多