这段代码:
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)
Run Code Online (Sandbox Code Playgroud)
创建此数据框:
> 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
Run Code Online (Sandbox Code Playgroud)
我经常使用group_by和summarizes的dplyr做得到组(如A,B,C)的参数.但我无法想出一个简单的方法来获得每组OK和NOK的数量(例如NOK百分比).我期望的结果是:
> result
Group %NOK
1 A 33.3
2 B 0
3 C 66.6
Run Code Online (Sandbox Code Playgroud)
在另一个步骤中,我希望用额外的意愿来计算比例.例如:计算NOK的数量,每组的天数> 20.我真正直截了当的解决方案是:
data %>% group_by(Group) %>% nrow(filter(Days < 20, State == "NOK")) / n() * 100
Run Code Online (Sandbox Code Playgroud)
但它会很好,如果你能给我一个解决方案,那实际上是有效的;)
我们可以用 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
Run Code Online (Sandbox Code Playgroud)
对于第二种情况
data %>%
group_by(Group) %>%
summarise(NOKPer = round(100*sum(State=="NOK" & Days >20)/n(), 2))
Run Code Online (Sandbox Code Playgroud)
这可以很容易地解决 base R
prop.table(table(data[-2]),1)
Run Code Online (Sandbox Code Playgroud)
并与第二个条件
prop.table(table(subset(data, Days>20, select=c("Group", "State"))),1)
Run Code Online (Sandbox Code Playgroud)