我正在尝试检测数据帧中的异常值并用NA替换异常值。 我稍微修改了这里提供的功能:How to repeat the Grubbs test and flag the outliers。在为矢量尝试函数时,它工作得很好,但我的问题是当我在数据帧上使用它时。该函数检测异常值,但我不知道如何将结果作为数据帧。
我想要的结果是我的原始数据框由NA
替换。 NA
将成为检测到的异常值的位置。
这是我迄今为止所尝试过的:
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)
}
知道如何使这项工作吗?
答案 0 :(得分:4)
你应该在while循环之前添加它:
na.vect <- test
因为如果它事先中断,你的na.vect将不存在,因此会抛出错误。然后在您的数据框上运行它,如下所示:
apply(rock,2,grubbs.flag)
第二个参数2告诉它将它应用于数据帧的列。使用1表示行。