我正在尝试创建一个能够自动查找和删除异常值的简单函数。这是我到目前为止创建的函数:
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 :(得分: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)