【问题标题】:Fixing a function to find and remove outliers from the dataset修复函数以从数据集中查找和删除异常值
【发布时间】:2016-08-17 06:14:37
【问题描述】:

我正在尝试制作一个简单的函数,它会自动查找和删除异常值。这是我目前创建的函数:

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)

【问题讨论】:

  • subsetwith 使用非标准评估。非常适合交互式使用,功能中可能存在问题,请参阅 adv-r.had.co.nz/Computing-on-the-language.html#nse-downsides 使用 boxplot(x[[y]])。但是自动去除异常值可能是个坏主意
  • 谢谢。我知道不建议在不检查数据的情况下删除异常值,但我这样做是出于学习目的。这个boxplot(x[[y]]) 不起作用!
  • 该代码期望 y 是作为字符串的列名(或给出列号的整数)
  • y 是列名(变量名)。当我给出列数时仍然不起作用。 with 不是函数内部的正确函数。我必须考虑其他选择。

标签: r function outliers


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2011-06-14
    • 2015-03-13
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2023-03-11
    相关资源
    最近更新 更多