【问题标题】:Grouping by multiple dimensions, summarise and add calculated column多维度分组,汇总并添加计算列
【发布时间】:2019-06-17 20:58:45
【问题描述】:

我有这个 df:

  boxChange   sameCat
# C1 > C2     TRUE
# C1 > C2     TRUE
# A0 > A1     TRUE
# A1 > E4     FALSE
# C3 > E6     FALSE
# E0 > E3     TRUE
# ...         ...

我想按两列分组,计算出现次数并按数量排列。通过使用dplyr,我会这样:

df2 <- df %>%  
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs))

获取:

  boxChange   sameCat   occs
# C1 > C2     TRUE      312
# A0 > A1     TRUE      189
# E0 > E3     TRUE      13
# C3 > E6     FALSE     123
# A1 > E4     FALSE     70

现在我想计算每个occs 占总数和累计百分比的百分比,得到类似这样的结果

  boxChange   sameCat   occs   perc   cump
# C1 > C2     TRUE      312    44      44
# A0 > A1     TRUE      189    27      71
# E0 > E3     TRUE       13     2      73
# C3 > E6     FALSE     123    17      90
# A1 > E4     FALSE      70    10     100

我尝试了以下

df2 <- df %>%  
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs)) %>%
mutate(perc = occs/sum(occs)*100) %>%
mutate(cump = cumsum(perc))

但是输出如下

  boxChange   sameCat   occs   perc   cump
# C1 > C2     TRUE      312    100     100
# A0 > A1     TRUE      189    100     100
# E0 > E3     TRUE       13    100     100
# C3 > E6     FALSE     123    100     100
# A1 > E4     FALSE      70    100     100

我不明白为什么会这样,也找不到任何其他线程报告类似问题。你有什么见解吗?

【问题讨论】:

    标签: r dplyr aggregate


    【解决方案1】:

    我们可能需要ungroup

    df2 <- df %>%  
           group_by(boxChange, sameCat) %>%
            summarise(occs = n()) %>%
            arrange(desc(occs)) %>%
            ungroup %>%
            mutate(perc = occs/sum(occs)*100, 
                   cump = cumsum(perc))
    

    --

    或者如果我们需要保持分组不变,使用sum(.$occs)

    更新

    如果我们从 OP 的 arraged 'occs' 开始

    df %>% 
      ungroup %>% 
      mutate(perc = round(occs/sum(occs) * 100),
             cump = cumsum(perc))
    #   boxChange sameCat occs perc cump
    #1   C1 > C2    TRUE  312   44   44
    #2   A0 > A1    TRUE  189   27   71
    #3   E0 > E3    TRUE   13    2   73
    #4   C3 > E6   FALSE  123   17   90
    #5   A1 > E4   FALSE   70   10  100
    

    【讨论】:

    • 谢谢! sum(.$occs) 正确获取 perc 列,虽然我一直得到错误的累积总和,但它的输出完全等于 perc
    • @tuspazio 我从 'df2' 的输入示例开始,它有 'occs' 列,并且很容易得到 'cump'
    • 再次感谢,不知道我做错了什么,但现在它可以正常工作了。再次感谢
    • @tuspazio 如果您已经加载了plyr,那么plyr::mutate 可能会掩盖dplyr::mutate 并导致误导性结果。
    • No 'plyer' 未加载
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2022-08-16
    • 2013-08-26
    相关资源
    最近更新 更多