计算每组条件的行

时间:2016-03-29 08:20:02

标签: r dplyr

此代码:

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

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

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

在另一个步骤中,我希望用额外的意愿来计算比例。例如:计算NOK的数量,其中天数&gt;每组20个。我真正直截了当的解决方案是:

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

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

1 个答案:

答案 0 :(得分:5)

我们可以使用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)