2016-04-23 75 views
0

我正在尝试做一个简单的函数,它将自动查找并删除异常值。这是我迄今为止创建的功能:修复查找和从数据集中删除异常值的功能

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) 
+0

'subset'和'with'使用非标准的评价。非常适合交互式使用,在函数中可能存在问题,请参阅http://adv-r.had.co.nz/Computing-on-the-language.html#nse-downsides使用'boxplot(x [[y]])'。但自动异常清除可能是一个坏主意 –

+0

谢谢。我知道不建议删除异常值而不检查数据,但我正在为学习目的而执行此功能。这个'boxplot(x [[y]])'不起作用! – klo

+0

该代码期望y作为字符串的列名(或给出列号的整数) –

回答

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) 
+0

谢谢,它的工作原理。 – klo