【问题标题】:How do you remove outliers in R?你如何删除R中的异常值?
【发布时间】:2019-04-11 13:33:09
【问题描述】:

我目前正在尝试以一种非常简单的方式删除 R 中的异常值。我知道您可以为此自行创建一些函数,但我想对这个简单的代码进行一些输入,以及为什么它似乎不起作用?

outliers <- boxplot(okt$pris)$out

okt_no_out <- okt[-c(outliers),]

boxplot(okt_no_out$pris)

第一行我创建了一个带有异常值的向量,第二行我创建了一个新的数据框,省略了该向量中的值。但是...当我检查新数据框时,仅删除了 750 个异常值中的大约 400 个?

向量异常值包含大约 750 行,但这样做时只会删除大约一半......

这些简单的代码行不应该以一种非常方便的方式去除异常值吗?

【问题讨论】:

  • 我猜你删除了原来的异常值。但这使得胡须缩小,并且在缩减集中出现了新的异常值。需要一个最小的可重现示例来确定

标签: r boxplot outliers


【解决方案1】:

boxplot$out 正在返回异常值的值,而不是异常值的位置。所以okt[-c(outliers),] 正在删除数据系列中的随机点,其中一些是异常值,而另一些则不是。

您可以做的是使用箱线图的统计信息的输出来检索上下胡须的末端,然后使用这些值过滤您的数据集。请看下面的例子:

#test data
testdata<-iris$Sepal.Width

#return boxplot object
b<-boxplot(testdata)

#find extremes from the boxplot's stats output
lowerwhisker<-b$stats[1]
upperwhisker<-b$stats[5]

#remove the extremes
testdata<-testdata[testdata>lowerwhisker & testdata<upperwhisker]

#replot
b<-boxplot(testdata)

【讨论】:

  • 谢谢,成功了!但是,为了消除极端情况,我不得不使用特定列而不是数据框 - testdata upper]
  • 我在上面的评论中打错了,应该是相反的方式
  • @Dave2e 这种技术如何应用​​于整个 DataFrame,因为我没有选择什么作为极端?
  • @suryarahul,我不明白你的问题。如果将数据框传递给箱线图函数,则 b$stats 将返回一个值矩阵,列是变量,行是 5 个统计数据(下限、25%、中位数、75% 和上限)
  • @Dave2e 如果我将完整的iris 数据传递给boxplot 函数,lowerwhiskerupperwhisker 会是什么?
【解决方案2】:

在您的代码中,c(outliers) 是异常值的向量,而不是行号;因此,当您将其添加到 [ ] 中进行索引时,它不会删除异常值所在的行。另一方面,-c(which(okt$pris %in% outliers)) 返回异常值所在的行号。希望这会有所帮助!

#filter outliers
outliers <- boxplot(okt$pris)$out

#drop the rows containing outliers
okt_no_out <- okt[-c(which(okt$pris %in% outliers)),]

#boxplot without outliers
boxplot(okt_no_out$pris)

【讨论】:

  • 请提供有关您的示例代码的更多信息。我不知道您使用哪种语言或哪个库。
  • 如果您能解释一下它是如何工作的,那将会很有帮助。 “希望这可以帮助!”实际上根本没有帮助。
  • @BuffK,这是没有库的 R。我认为卢卡斯从this 复制了代码。
  • 刚刚编辑了评论,抱歉我不是很清楚!
猜你喜欢
  • 2012-08-11
  • 2018-05-09
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多