使用`boxplot.stats`删除R中的数据框异常值

时间:2018-07-08 09:51:21

标签: r dataframe subset outliers

我在R相对较新,所以请多包涵。

我正在使用Ames数据集(数据集here的完整描述;链接到数据集下载here)。

我正在尝试创建一个子集数据框架,该框架将允许我运行线性回归分析,并且正在尝试使用boxplot.stats函数删除异常值。我使用以下代码创建了一个包含样本的框架:

regressionFrame <- data.frame(subset(ames_housing_data[,c('SalePrice','GrLivArea','LotArea')] , BldgType == '1Fam'))

我的下一个目标是删除异常值,因此我尝试使用which()函数进行子集化:

regressionFrame <- regressionFrame[which(regressionFrame$GrLivArea != boxplot.stats(regressionFrame$GrLivArea)$out),]

不幸的是,产生了

  

较长的对象长度不是较短的对象长度的倍数

错误。有没有人知道一种更好的方法来实现此目的,最好使用which()子设置功能?我假设它会包含某种形式的lapply(),但对于我的一生,我不知道该怎么做。 (我认为以后总是可以学习更高级的方法,但这是我现在所要学习的方法,因为我已经理解了。)

1 个答案:

答案 0 :(得分:2)

boxplot.stats很好用。

如果!=boxplot.stats中返回多个异常值,则无法使用$out安全测试。这里的类比是1:5 != 1:3。您可能想尝试!(1:5 %in% 1:3)

regressionFrame <- subset(regressionFrame,
                          subset = !(GrLivArea %in% boxplot.stats(GrLivArea)$out))

“安全”是指1:5 != 1:3给出错误结果并带有警告,而1:6 != 1:3给出错误结果而没有警告。该警告与回收规则有关。在后一种情况下,1:3可以被回收以具有相同的1:6长度(即1:6的长度是1:3的倍数),因此您将使用1:6 != c(1:3, 1:3)进行测试。


一个简单的例子。

x <- c(1:10/10, 101, 102, 103)  ## has three outliers: 101, 102 and 103
out <- boxplot.stats(x)$out  ## `boxplot.stats` has picked them out
x[x != out]  ## this gives a warning and wrong result
x[!(x %in% out)]  ## this removes them from x