【问题标题】:Get frequencies from counts, with multiple levels of grouping从计数中获取频率,具有多级分组
【发布时间】:2021-03-03 17:48:03
【问题描述】:

我有一个如下的数据框:

df <- data.frame(group1=c("A","A","A","A","B","B","B","B"),
                 group2 = c("X", "X", "Y", "Y","X", "X", "Y", "Y"),
                 type = c("a", "b", "c","d","e","f","g","h"),
                 count = c(1,2,3,4,5,6,7,8))

> df
  group1 group2 type count
1      A      X    a     1
2      A      X    b     2
3      A      Y    c     3
4      A      Y    d     4
5      B      X    e     5
6      B      X    f     6
7      B      Y    g     7
8      B      Y    h     8

我想将按group1group2 分组的每种类型的相对频率放入一列。我有办法做到这一点,但它很笨拙,需要总结然后加入。我觉得必须有一种方法可以在一个 dplyr 声明中做到这一点。但我想不通的是,在总结之后,我需要回到所有行。

我的笨方法:

df.summ <- df %>% group_by(group1, group2) %>% 
  summarize(tot = sum(count))

df <- left_join(df, df.summ)

df <- df %>% mutate(freq = count/tot)

> df
  group1 group2 type count tot      freq
1      A      X    a     1   3 0.3333333
2      A      X    b     2   3 0.6666667
3      A      Y    c     3   7 0.4285714
4      A      Y    d     4   7 0.5714286
5      B      X    e     5  11 0.4545455
6      B      X    f     6  11 0.5454545
7      B      Y    g     7  15 0.4666667
8      B      Y    h     8  15 0.5333333

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果我们使用mutate 而不是summarise/left_join 会更直接,因为summarise 默认每组只返回一行,而mutate 在原始数据集中创建一个新列

    library(dplyr)
    df1 <- df %>% 
       group_by(group1, group2) %>%
       mutate(freq = count/sum(count)) %>%
       ungroup
    

    【讨论】:

    • 谢谢。我想我从来没有意识到我可以在group_by 之后使用mutate!请问,ungroup 在这里做什么?似乎有或没有它都给出相同的输出
    • @BenS。使用mutate,之后不会删除组属性。因此,如果您不按组进行任何其他操作(或在未分组的情况下进行某些操作),则不需要它,甚至可能对某些 RMD 针织等产生不利影响
    【解决方案2】:

    基本 R 单线:

    df$freq <- with(df, ave(count, list(group1, group2), FUN = function(x) x/sum(x)))
    df
    #  group1 group2 type count      freq
    #1      A      X    a     1 0.3333333
    #2      A      X    b     2 0.6666667
    #3      A      Y    c     3 0.4285714
    #4      A      Y    d     4 0.5714286
    #5      B      X    e     5 0.4545455
    #6      B      X    f     6 0.5454545
    #7      B      Y    g     7 0.4666667
    #8      B      Y    h     8 0.5333333
    

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2011-12-17
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多