2016-09-28 4 views
1

Ich versuche Ausreißer in meinem Datenframe zu erkennen und die Ausreißer durch NAs zu ersetzen. Ich habe die hier angebotene Funktion leicht modifiziert: How to repeat the Grubbs test and flag the outliers. Wenn ich die Funktion für einen Vektor ausprobiere, funktioniert es großartig, aber mein Problem ist, wenn ich es auf einem Datenrahmen verwende. Die Funktion erkennt Ausreißer, aber ich weiß nicht, wie ich die Ergebnisse als Datenframe bekommen kann.Ersetzen von Werten in df mit Index

Was ich als Ergebnis will, ist mein ursprünglicher Datenrahmen ersetzt durch NA s. Wobei NA die erkannten Ausreißer sind.

Dies ist, was ich bis jetzt versucht:

library(outliers) 
data("rock") 

# Function to detect outliers with Grubbs test in a vector 
grubbs.flag <- function(vector) { 
outliers <- NULL 
test <- vector 
grubbs.result <- grubbs.test(test) 
pv <- grubbs.result$p.value 
# throw an error if there are too few values for the Grubb's test 
if (length(test) < 3) stop("Grubb's test requires > 2 input values") 
while(pv < 0.05) { 
outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3])) 
test <- vector[!vector %in% outliers] 
# stop if all but two values are flagged as outliers 
if (length(test) < 3) { 
    warning("All but two values flagged as outliers") 
    break 
} 
grubbs.result <- grubbs.test(test) 
pv <- grubbs.result$p.value 
idx.outlier <- which(vector %in% outliers) 
na.vect <- replace(vector, idx.outlier, NA) 

} 
return(na.vect) 
} 

# Function to detect outliers with Grubbs test in a dataframe 
Grubbs.df <- function(data){ 
grubbs.data <- (as.vector(unlist(apply(data, grubbs.flag)))) 
return(grubbs.data) 
} 

Jede Idee, wie diese Arbeit zu machen?

+0

Ich denke, etwas mit Ihrer Anwendung und as.vector am Ende des Skripts zu tun. Ich werde es auf meinem Laptop laufen und für dich sehen, was los ist. – Ansjovis86

Antwort

4

Sie sollen diese hinzufügen, bevor die while-Schleife:

na.vect <- test 

Denn wenn es vorher bricht, wird Ihr na.vect nicht existieren und somit einen Fehler aus. Und dann führen Sie einfach auf den Datenrahmen wie folgt aus:

apply(rock,2,grubbs.flag) 

Das zweite Argument 2 sagt es zu den Spalten der Datenrahmen anzuwenden. Verwenden Sie 1 für Zeilen.

Verwandte Themen