【问题标题】:Counting number/share of groups under criteria根据标准计算组的数量/份额
【发布时间】:2017-07-29 01:07:45
【问题描述】:

我有以下数据框结构:

   Score  V1   V2   V3 ...
     1    12   15   0     
     2    17   25   13     
     3    0    0    18
     1    0    12   25     
     3    11   41   0    
     3    18   0    0    

我想为每个score 组(在我的示例中为 1/2/3)和每列(V1/V2/V3...)计算值大于 0 的行数。

所以,我想得到以下结果:

   Score  V1    V2    V3 ...
     1    50%   100%  50%     
     2    100%  100%  100%     
     3    67%   33%   33%

我开始使用dplyr 解决它,但我被过滤部分卡住了:

hun_percent <- 
  hun %>% 
  group_by(Score) %>% 
  summarise_each(funs(n=n()))

【问题讨论】:

    标签: r filter dplyr aggregate


    【解决方案1】:

    使用基数 R,我们可以使用aggregate,并且对于每个Score,我们可以计算大于 0 的值与值总数的比率。

    aggregate(.~Score, hun, function(x) length(x[x>0])/length(x) * 100)
    
    #Score        V1        V2        V3
    #1     1  50.00000 100.00000  50.00000
    #2     2 100.00000 100.00000 100.00000
    #3     3  66.66667  33.33333  33.33333
    

    我不确定dplyr 是否有更好的选择。但是,一种类似的方式是

    library(dplyr)
    hun %>%
     group_by(Score) %>%
     summarise_each(funs(length(.[.>0])/length(.) * 100))
    

    【讨论】:

    • 也将rowsum(+(df[-1] &gt; 0), df[, 1])/tabulate(df[, 1]) * 100 作为矢量化选项
    • @DavidArenburg 看起来令人印象深刻。添加为答案?
    • 虽然不是那么安全。它需要 df[, 1] 既是数字又是排序的(就像在 OPs 示例中一样),所以我想答案不够笼统。
    • @RonakShah 感谢您的回答。只是一件小事..当我应用你的 2 个选项(base R 或dplyr)时,我得到了一些小的差异。你知道为什么会这样吗? (可能是数字round
    • @staove7 的区别在哪里?例子?
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2013-10-04
    • 2022-07-08
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多