修复函数以查找和删除数据集中的异常值

时间:2016-04-23 16:56:32

标签: r function outliers

我正在尝试创建一个能够自动查找和删除异常值的简单函数。这是我到目前为止创建的函数:

fOutlier <- function(x, y) {
     outlier <- with(x, boxplot.stats(y)$out)
     subset(x, !(y %in% outlier))
}
data <- fOutlier(data, variable)

问题是该函数不会将x读取为数据集名称。如果我使用以下内容,它可以工作:

data <- fOutlier(data, data$variable)

1 个答案:

答案 0 :(得分:0)

Non-standard evaluation似乎是罪魁祸首。

这就是我个人所做的。

set.seed(1)

# mock data set
d<-data.frame(var1=rnorm(1000,500,50), 
              var2=rnorm(1000,1000,100),
              var3=rnorm(1000,1000,100), 
              var4=rnorm(1000,1000,100))

fOutlier<-function(dat, var_name){
  var_vec<-dat[,var_name]
  outliers<-boxplot.stats(var_vec)$out
  clean_dat<-dat[!(var_vec %in% outliers),]
}

# test with different variables
d_var1_clean<-fOutlier(d, 'var1')
d_var2_clean<-fOutlier(d, 'var2')
d_var3_clean<-fOutlier(d, 'var3')

如果您真的喜欢非标准评估,那么您可以添加eval()和substitute()来维护此功能。

此功能是您发布的内容的可行版本(请注意y_vec的创建):

fOutlier2 <- function(x, y) {  
  y_vec<-eval(substitute(y),eval(x))
  outlier <- boxplot.stats(y_vec)$out
  subset(x, !(y_vec %in% outlier))
}
d_var1_clean2<-fOutlier2(d, var1)