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?
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