【问题标题】:Testing for ouliers in a dataframe测试数据框中的异常值
【发布时间】:2013-03-05 08:29:26
【问题描述】:

我是 R 新手,我尝试使用一个函数来测试大型数据框中的异常值,该数据框中有 600 多个变量,除了最后两列之外,所有变量都是数字。我尝试了 outliers 包中的异常值函数来一次测试一列,我以无法使用的数字向量结束。有没有更好的方法来识别数据框中的所有异常值。

 myout <- c()
    for (i in 1:dim(training)[2]){
     if (is.numeric(training[,i])) {
     myout <- c(myout,outlier(training[,i]))  }
     }

【问题讨论】:

  • 你最终得到了一个向量,因为你创建了一个向量。这里有什么问题?如果最后两列不是数字,为什么要测试它们?
  • 异常值函数到底出了什么问题?一方面,可以给异常值函数一个数据框,在其中单独测试每一列...
  • 你读过?outlier吗?它返回向量中与平均值最不同的值,因此值向量正是您的代码所期望的。你期望输出什么?
  • 我会比杰克更强调。您必须查看引用的答案。如果您有极端值的数据,除非您能够确定原因,否则您应该保留并使用适当的方法。仅仅丢弃“异常值”是一项重大的统计罪过。

标签: r


【解决方案1】:

正如您在异常值的帮助文件中看到的那样,它会为每个变量找到一个值,该值与平均值的差异最大。我认为您想要的是为每个变量找到所有异常值数据点的索引。这可以通过以下方式完成(当然您需要先删除非数字变量):

# first write a custom function that returns the index of all outliers
# I define an outlier as 3 sd's away from the mean, you can adjust that

is.outlier <- function(x) which(abs(x - mean(x)) > 3*sd(x))

# turn the df into a list, and apply the function to each variable with lapply

df.as.list <- as.list(df)   # enter the name of your data frame instead of df
lapply(df.as.list, is.outlier)

它将返回一个列表,其中元素 i 是变量异常值的索引 第 i 列。

【讨论】:

    【解决方案2】:

    您可能实际上并不想删除异常值,但根据 2 年前的 this

    x[!x %in% boxplot.stats(x)$out] 
    

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2018-12-03
      • 2021-11-13
      • 1970-01-01
      • 2012-03-20
      • 2015-07-06
      相关资源
      最近更新 更多