【问题标题】:Count row with condition per group计算每组条件的行
【发布时间】:2016-03-29 08:20:02
【问题描述】:

这段代码:

Group <- rep(c("A", "B", "C"), each = 3)
Days <- c(21,21,19,18,21,21,11,21,19)
State <- c("OK", "NOK", "OK", "OK", "NOK", "OK", "OK", "OK", "NOK")

data <- data.frame(Group = Group, Days = Days, State = State)

创建这个数据框:

> data
  Group Days State
1     A   21    OK
2     A   21   NOK
3     A   19    OK
4     B   18    OK
5     B   21    OK
6     B   21    OK
7     C   11   NOK
8     C   21    OK
9     C   19   NOK

我经常使用dplyr 中的group_bysummarizes 来获取组的参数(例如A、B、C)。但我想不出一种简单的方法来获取每组的 OK 和 NOK 的数量(例如 NOK 百分比)。我期望的结果是:

  > result
      Group   %NOK
    1     A   33.3
    2     B      0
    3     C   66.6 

在进一步的步骤中,我希望使用其他条件来计算比例。例如:计算 NOK 的数量,其中每组的天数 > 20。我真正直接的解决方案是:

data %>% group_by(Group) %>% nrow(filter(Days < 20, State == "NOK")) / n() * 100

但如果你能给我一个解决方案,那就太好了;)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用summarise

    data %>% 
       group_by(Group) %>% 
       summarise(NOKPer = round(100*sum(State=="NOK")/n(),2))
    #     Group NOKPer
    #    (chr)  (dbl)
    # 1     A  33.33
    # 2     B   0.00
    # 3     C  66.67
    

    对于第二种情况

    data %>%
        group_by(Group) %>% 
        summarise(NOKPer = round(100*sum(State=="NOK" & Days >20)/n(), 2))
    

    这可以使用base R轻松解决

    prop.table(table(data[-2]),1)
    

    还有第二个条件

    prop.table(table(subset(data, Days>20, select=c("Group", "State"))),1)
    

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2021-09-23
      • 2017-01-07
      • 2021-07-30
      • 2015-12-13
      相关资源
      最近更新 更多