【问题标题】:Finding percentage in a sub-group using group_by and summarise使用 group_by 查找子组中的百分比并汇总
【发布时间】:2015-06-15 11:33:56
【问题描述】:

我是 dplyr 的新手,并试图在没有任何运气的情况下进行以下转换。我在互联网上进行了搜索,发现了在 ddply 中执行相同操作的示例,但我想使用 dplyr。

我有以下数据:

   month   type  count
1  Feb-14  bbb   341
2  Feb-14  ccc   527
3  Feb-14  aaa  2674
4  Mar-14  bbb   811
5  Mar-14  ccc  1045
6  Mar-14  aaa  4417
7  Apr-14  bbb  1178
8  Apr-14  ccc  1192
9  Apr-14  aaa  4793
10 May-14  bbb   916
..    ...  ...   ...

我想使用 dplyr 来计算每月级别的每种类型(aaa、bbb、ccc)的百分比,即

   month   type  count  per
1  Feb-14  bbb   341    9.6%
2  Feb-14  ccc   527    14.87%
3  Feb-14  aaa  2674    ..
..    ...  ...   ...

我试过了

data %>%
  group_by(month, type) %>%
  summarise(count / sum(count))

这会给出一个 1 作为每个值。如何使当月所有类型的总和(计数)总和?

【问题讨论】:

    标签: r group-by dplyr


    【解决方案1】:

    试试

    library(dplyr)
    data %>%
        group_by(month) %>%
        mutate(countT= sum(count)) %>%
        group_by(type, add=TRUE) %>%
        mutate(per=paste0(round(100*count/countT,2),'%'))
    

    或者在不创建额外列的情况下使其更简单

    data %>%
        group_by(month) %>%
        mutate(per =  100 *count/sum(count)) %>% 
        ungroup
    

    我们也可以用“月”总结sum(count)后使用left_join

    或者使用data.table的选项。

     library(data.table)
     setkey(setDT(data), month)[data[, list(count=sum(count)), month], 
                   per:= paste0(round(100*count/i.count,2), '%')][]
    

    【讨论】:

      【解决方案2】:

      而且代码少一点:

      df <- data.frame(month=c("Feb-14", "Feb-14", "Feb-14", "Mar-14", "Mar-14", "Mar-14", "Apr-14", "Apr-14", "Apr-14", "May-14"),
                   type=c("bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb"),
                   count=c(341, 527, 2674, 811, 1045, 4417, 1178, 1192, 4793, 916))
      
      
      library(dplyr)
      
      df %>% group_by(month) %>% 
             mutate(per=paste0(round(count/sum(count)*100, 2), "%")) %>% 
             ungroup
      

      由于您想“保持”数据框不变,因此您不应该使用 summarisemutate 就足够了。

      【讨论】:

        【解决方案3】:

        我们可以使用prop.table 来获取每个组内的比例。

        这可以写成dplyr

        library(dplyr)
        df %>% group_by(month) %>% mutate(per= prop.table(count) * 100)
        
        #  month  type  count    per
        #   <chr>  <chr> <dbl>  <dbl>
        # 1 Feb-14 bbb     341   9.63
        # 2 Feb-14 ccc     527  14.9 
        # 3 Feb-14 aaa    2674  75.5 
        # 4 Mar-14 bbb     811  12.9 
        # 5 Mar-14 ccc    1045  16.7 
        # 6 Mar-14 aaa    4417  70.4 
        # 7 Apr-14 bbb    1178  16.4 
        # 8 Apr-14 ccc    1192  16.6 
        # 9 Apr-14 aaa    4793  66.9 
        #10 May-14 bbb     916 100   
        

        基础 R:

        df$per <- with(df, ave(count, month, FUN = prop.table) * 100)
        

        data.table

        library(data.table)
        setDT(df)[, per := prop.table(count) * 100, month]
        

        【讨论】:

        • 哇,这非常有帮助!谢谢!
        • 是的,很好的提示!
        猜你喜欢
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多