我目前正在尝试以一种非常简单的方式删除R中的异常值。我知道您可以为此自己创建函数,但是我想在此简单代码上输入一些信息,为什么它似乎不起作用?
outliers <- boxplot(okt$pris)$out
okt_no_out <- okt[-c(outliers),]
boxplot(okt_no_out$pris)
因此,第一行我创建了一个带有异常值的向量,第二行我创建了一个新的数据框,忽略了该向量中的值。但是...当我检查新数据框时,仅删除了750个离群值中的约400个?
因此,向量离群值大约包含750行,但是这样做时,它们仅去除了大约一半。...
所以,我的简单问题。我可能很愚蠢,但是这些简单的代码行不应该以一种非常方便的方式消除异常值吗?
//彼得
答案 0 :(得分: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)
答案 1 :(得分:0)
在您的代码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)