2016-09-23 4 views
1

Ich versuche Datenpunkte zu setzen, die außerhalb der oberen/unteren Quantile +/- 3 * IQR zu NA liegen. Die Herausforderung, die ich habe, ist, wie man das mit einer Datengruppe macht.Wie man die boolesche Ausgabe der Funktion "by" an den Eingabevektor anpasst

Als Beispiel enthält der folgende Datensatz eine geteilte Spalte und eine Wertespalte. Für jeden Split muss ich die oberen und unteren Quantile und IQRs der Wertespalte berechnen und dann die Datenpunkte in der Wertspalte, die die obige Bedingung erfüllt, auf NA setzen.

x <- structure(list(Split = c(1L, 1L, 3L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 2L, 3L), Value = c(0.9, 0.9, 3.5, 2.2, 2.2, 2.2, 2.2, 0.9, 3.5, 3.5, 3.5, 1.1, 3.5, 0.9, 1.9, 3.4, 0.9, 3.5, 2.2, 3.5)), .Names = c("Split", "Value"), class = "data.frame", row.names = c(NA, -20L)) 

Ich habe die „von“ -Funktion benutzt, um die Werte zu identifizieren, die auf NA eingestellt werden müssen:

out <- by(
    x$Value, 
    x$Split, 
    function(y) 
    y < (quantile(y, probs=c(.25, .75), na.rm = T)[1] - 3*IQR(y, na.rm = T)) | 
    y > (quantile(y, probs=c(.25, .75), na.rm = T)[2] + 3*IQR(y, na.rm = T))) 

Die I die Ausgabe mit „fehlenden oder“ verwendet, um die Datenpunkte auf NA eingestellt :

x$Value[unlist(out)] <- NA 

Dies funktioniert nicht. Grund ist die unterschiedliche Sortierung zwischen der Ausgabe "by" und der Spalte x $ Value.

Irgendwelche Vorschläge, wie ich beide Ausgänge zusammenbringen und die entsprechenden Werte auf NA setzen kann?

Danke.

Antwort

1

können Sie unsplit anstelle von unlist die Spaltung von by zu umkehren:

x$Value[unsplit(out, x$Split)] <- NA 
## Split Value 
##1  1 0.9 
##2  1 0.9 
##3  3 3.5 
##4  2 2.2 
##5  2 2.2 
##6  2 2.2 
##7  2 2.2 
##8  1 0.9 
##9  3 3.5 
##10  3 3.5 
##11  3 3.5 
##12  3 NA 
##13  3 3.5 
##14  1 0.9 
##15  1 NA 
##16  3 NA 
##17  1 0.9 
##18  3 3.5 
##19  2 2.2 
##20  3 3.5 

Wieder x$Split als Faktor verwendet, der die Spaltung bestimmt.

Verwandte Themen