2016-03-29 12 views
2

Diesen Code:Dplyr: Count Zeile mit der Bedingung pro Gruppe

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) 

diesen Datenrahmen erstellen.

> 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 

ich oft group_by und summarizes von dplyr verwenden Sie Parameter von Gruppen erhalten (zB A , B, C). Aber ich konnte keinen einfachen Weg finden, um die Menge OKs und NOKs pro Gruppe zu bekommen (zB Prozentsatz NOK). Das Ergebnis würde ich erwarten:

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

In einem weiteren Schritt möchte ich Anteile mit zusätzlichen Bedingungen zählen. Zum Beispiel: Zählen Sie die Anzahl der NOKs, wobei Tage für jede Gruppe> 20 sind. Meine wirklich einfache Lösung wäre:

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

aber es wäre schön, wenn Sie meinen, eine Lösung geben könnte, dass tatsächlich funktioniert;)

Antwort

4

Wir können 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 

Für der zweite Fall

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

Diese können leicht gelöst werden base R

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

und mit der zweiten Bedingung

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

perfekt funktioniert, vielen Dank für die schnelle Antwort mit – WitheShadow

Verwandte Themen