2016-10-28 8 views
0

Ich muss Vektoren [Attribute] von remove_outliers Funktion in einem Datenrahmen zurückgegeben. Gerade jetzt, ich bekomme eine große Matrix. Ich habe append Methode versucht (folgend)binden Vektoren in einer Schleife mit R

# function to calculate IQR and upper and lower limit of given attribute 
remove_outliers <- function(attribute, na.rm = TRUE, ...) { 
    IQR_val <- quantile(attribute, probs=c(.25, .75), na.rm = na.rm, ...) 
    LF <- 1.5 * IQR(attribute, na.rm = na.rm) 
    attribute_W_NA <- attribute 
    attribute_W_NA[attribute < (IQR_val[1] - LF)] <- NA 
    attribute_W_NA[attribute > (IQR_val[2] + LF)] <- NA 
    attribute_W_NA 
} 

cleaned_data <- NULL 

for(i in 1:ncol(data_rm_val)){ 
    # cleaned data with NA entries replacing outliers 

    cleaned_data <- cbind(cleaned_data, remove_outliers(data_rm_val[,i])) 

} 

es in großer Matrix führt

Dies ist Eingangsdatenrahmen: enter image description here

Stromausgang ist: (mit cbind in loop) enter image description here

und das gewünschte Ergebnis sollte ein Datenrahmen mit der gleichen Anzahl von Zeilen und Spalten sein.

Jede Hilfe würde sehr geschätzt werden. PS: Ich bin ein Neuling in R und Data Science.

+0

Für eine Schleife versuchen Sie 'cbind' anstelle von' append', obwohl 'apply (data_rm_val, 2, remove_outliers)' wird wahrscheinlich schneller und besser für das, was Sie wollen. – Barker

+0

Wenn Sie eine Schleife verwenden möchten, weisen Sie ein Objekt mit der richtigen Größe vor oder Sie erhalten eine schreckliche Leistung. Das heißt, es gibt bessere Möglichkeiten, dies ohne eine Schleife zu tun. Wenn Sie Ihrer Frage einige Daten hinzufügen, wird wahrscheinlich jemand eine davon veröffentlichen. – alistaire

+0

okay. Ich werde das versuchen. Ich versuchte cbind auch. Ich habe einen Datenrahmen (eine große Matrix). –

Antwort

1

Verwenden Sie einfach lapply mit Ihrer benutzerdefinierten Funktion und vermeiden Sie das Verbinden oder Anhängen. Wenn lapply() auf einem Datenrahmen unter Verwendung führen Sie Operationen auf jeder Spalte:

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers)) 

Jetzt oben nimmt an Ihre definierte Funktion, remove_outliers einen Vektortyp zurückgibt. Um sicherzustellen, dass ein Vektor immer ausgibt, solle vapply(), die eine Länge gleich Eingang oder nrow(data_rm_val):

cleaned_data <- data.frame(vapply(data_rm_val, remove_outliers, numeric(nrow(data_rm_val)))) 

Vor zwei Optionen funktionieren auf einem Datensatz von Zufallszahlen (seit OP nicht Beispiel Daten zur Verfügung stellen):

data_rm_val <- data.frame(matrix(rnorm(25),5)) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766 1.8152041 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979 -1.7940421 -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656 1.23811458 

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers)) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766   NA 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979   NA -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656   NA 

cleaned_data2 <- data.frame(vapply(data_rm_val, 
            remove_outliers, numeric(nrow(data_rm_val)))) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766   NA 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979   NA -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656   NA 
+0

hat es funktioniert. Danke vielmals!!! –

+0

Großartig! Froh, dass ich helfen konnte. Bitte akzeptieren Sie die Lösung, um die Auflösung zu bestätigen. – Parfait

+0

Leider ist mein Ruf hierzulande gering. kann nur für dich beten. Bleib gesegnet! –