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)
'subset'和'with'使用非标准的评价。非常适合交互式使用,在函数中可能存在问题,请参阅http://adv-r.had.co.nz/Computing-on-the-language.html#nse-downsides使用'boxplot(x [[y]])'。但自动异常清除可能是一个坏主意 –
谢谢。我知道不建议删除异常值而不检查数据,但我正在为学习目的而执行此功能。这个'boxplot(x [[y]])'不起作用! – klo
该代码期望y作为字符串的列名(或给出列号的整数) –