你如何删除 R 中的异常值?
How do you remove outliers in R?
我目前正在尝试以一种非常简单的方式删除 R 中的异常值。我知道您可以为此自行创建一些功能,但我想对这个简单的代码进行一些输入,以及为什么它似乎不起作用?
outliers <- boxplot(okt$pris)$out
okt_no_out <- okt[-c(outliers),]
boxplot(okt_no_out$pris)
第一行我创建了一个带有离群值的向量,第二行我创建了一个新的数据框,省略了该向量中的值。但是......当我检查新数据框时,750 个异常值中只有大约 400 个被删除?
矢量离群值包含大约 750 行,但是执行此操作时它只删除了大约一半....
这些简单的代码行不应该以非常方便的方式去除异常值吗?
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)
在您的代码中,c(outliers)
是离群值的向量,而不是行号;因此,当您将它添加到 [ ]
中以进行索引时,它不会删除异常值所在的行。另一方面,-c(which(okt$pris %in% outliers))
returns 异常值所在的行号。希望这对您有所帮助!
#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)
我目前正在尝试以一种非常简单的方式删除 R 中的异常值。我知道您可以为此自行创建一些功能,但我想对这个简单的代码进行一些输入,以及为什么它似乎不起作用?
outliers <- boxplot(okt$pris)$out
okt_no_out <- okt[-c(outliers),]
boxplot(okt_no_out$pris)
第一行我创建了一个带有离群值的向量,第二行我创建了一个新的数据框,省略了该向量中的值。但是......当我检查新数据框时,750 个异常值中只有大约 400 个被删除?
矢量离群值包含大约 750 行,但是执行此操作时它只删除了大约一半....
这些简单的代码行不应该以非常方便的方式去除异常值吗?
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)
在您的代码中,c(outliers)
是离群值的向量,而不是行号;因此,当您将它添加到 [ ]
中以进行索引时,它不会删除异常值所在的行。另一方面,-c(which(okt$pris %in% outliers))
returns 异常值所在的行号。希望这对您有所帮助!
#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)