2017-02-07 5 views
1

Mit einem Datenrahmen wie untenR - Aggregat mit Formel

set.seed(100) 
dfm <- data.frame(
id=sample(1:100, 6, replace = TRUE), 
val1 = rep(c("true", "false"), 3), 
val2=sample(c("true", "false"), 6, replace = TRUE)) 

    id val1 val2 
1 31 true false 
2 26 false true 
3 56 true false 
4 6 false true 
5 47 true false 
6 49 false false 

von id aggregieren benötigen, so dass das Ergebnis des Auftreten von true pro id hat. Also versuche ich, die folgenden

> aggregate(. ~ id, dfm, function(x) { length(x[x == "true"])}) 

    id val1 val2 
1 6 0 0 
2 26 0 0 
3 31 0 0 
4 47 0 0 
5 49 0 0 
6 56 0 0 
> 

Dies ist jedoch nicht die Anzahl der „echten“ Rückkehr für jede Spalte.

Antwort

1

Wir rowsum

rowsum(+(dfm[-1]=="true"), dfm$id) 

In Bezug auf, warum der Code des OP funktioniert nicht verwenden kann, ist es wegen der factor Spalten 'val'. Verwenden Sie stringsAsFactors=FALSE bei der Erstellung der 'dfm' und der OP-Code sollte funktionieren. Wenn die Spalten factor sind, erhält die aggregate den integer Speichermodus anstelle der ‚wahr/falsch‘ Werte in allen 0.

dfm <- data.frame(
    id=sample(1:100, 6, replace = TRUE), 
    val1 = rep(c("true", "false"), 3), 
    val2=sample(c("true", "false"), 6, replace = TRUE), stringsAsFactors=FALSE) 

aggregate(. ~ id, dfm, function(x) { length(x[x == "true"])}) 
# id val1 val2 
#1 21 1 0 
#2 29 1 1 
#3 36 0 0 
#4 40 0 0 
#5 67 0 0 
#6 77 1 0 
resultierenden