2017-02-08 6 views
1

Wenn ich einen Datenrahmen aggregieren wie unten ich feststellen, dass einige der von Spaltenwerte aggregiert werden fallen gelassen zu werdenAggregieren mehrere Spalten - Dropped von Spaltenwert aggregiert

set.seed(100) 
    b <- data.frame(id=sample(1:3, 5, replace=TRUE), 
     prop1=sample(c(TRUE,FALSE),5, replace = TRUE), 
     prop2= sample(c(TRUE,FALSE,NA), 5, replace= TRUE)) 

    > b 
     id prop1 prop2 
    1 3 FALSE TRUE 
    2 1 FALSE NA 
    3 2 FALSE NA 
    4 2 FALSE FALSE 
    5 3 TRUE TRUE 
    > aggregate(. ~ id, b, function(x) { length(x[x == TRUE])/length(x)}) 
     id prop1 prop2 
    1 2 0.0  0 
    2 3 0.5  1 

Was 1 hier id passiert - warum es fallen gelassen ?

+0

Weil 'prop2' für "id = 1" ist "NA". P.S. immer wenn du 'sample' in Codes verwendest und bitte hier eine Frage stellst, bitte' set.seed' also Beispiel ist immer exakt reproduzierbar –

+0

Warum wird 'id = 2' nicht gelöscht,' prop2' für 'id = 2' ist 'NA' auch – user3206440

Antwort

0

Wenn Sie sich die Hilfe von aggregate ansehen, werden Sie feststellen, dass es einen Parameter gibt, der angibt, wie fehlende Werte behandelt werden: na.action. Nach einigen Versuchen, fand ich einen Samen, der Ihr Problem erschafft;)

set.seed(3) 
b <- data.frame(id=sample(1:6, 10, replace=TRUE), 
      prop1=sample(c(TRUE,FALSE),10, replace = TRUE), 
      prop2= sample(c(TRUE,FALSE,NA), 10, replace= TRUE)) 
b 

    id prop1 prop2 
1 3 TRUE TRUE 
2 6 TRUE NA 
3 4 FALSE FALSE 
4 4 FALSE TRUE 
5 4 TRUE NA 
6 3 TRUE NA 
7 2 FALSE FALSE 
8 3 TRUE FALSE 
9 3 TRUE TRUE 
10 4 FALSE FALSE 

So haben wir diese ID 6.

Dieses Zeug tun sollten:

aggregate(. ~ id, b, function(x) { sum(x,na.rm=TRUE)/length(x)}, na.action=NULL) 

    id prop1 prop2 
1 2 0.00 0.00 
2 3 1.00 0.50 
3 4 0.25 0.25 
4 6 1.00 0.00 
+0

Übrigens, das ist das Verhalten für Formel-Methode Aggregat. Ich habe wieder diesen ersten Post gefunden, wo ich das mit nützlichen Details gelernt habe: http://StackOverflow.com/Questions/16844613/Na-Values-and-R-aggregate-Function –

+0

warum würde nicht aggregieren (. ~ ID, b, Funktion (x) {Länge (x [x == WAHR])/Länge (x)}, na.action = NULL) 'geben Sie die gleichen Ergebnisse? – user3206440

+0

Oh ;; hängt davon ab, was Sie als Endergebnis wollen. schau auf 'x [x == TRUE]' wenn es 'NA' in' x' gibt. Mit 'na.action = NULL' werden alle Werte übergeben und mit' function (x) 'behandelt. Letztlich hängt es also davon ab, ob Sie' NA' in Berechnungen einbeziehen wollen oder nicht (daher meine 'sum (..., na. rm = TRUE) 'um zu vermeiden, sie zu zählen) –

Verwandte Themen