2016-09-28 199 views
1

我试图在我的数据框中检测异常值,并用NA替换异常值。 我稍微修改了这里提供的功能:How to repeat the Grubbs test and flag the outliers。当尝试一个向量的函数时效果很好,但是我的问题是当我在数据框上使用它时。该函数检测异常值,但我不知道如何将结果作为数据帧。使用索引替换df中的值

我想要的结果是我的原始数据框由NA s取代。 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

我猜想你的申请和as.vector在脚本的末尾。我会在笔记本电脑上运行它,并为您查看正在发生的事情。 – Ansjovis86

回答

4

你应该while循环之前补充一点:

na.vect <- test 

因为如果事先打破,你na.vect将不存在,因此将抛出一个错误。然后就像这样在你的数据帧上运行它:

apply(rock,2,grubbs.flag) 

第二个参数2告诉将它应用到数据帧的列。对行使用1。