我在R比较新,所以请耐心等待。
我正在使用Ames数据集(数据集的完整描述在这里;链接到数据集下载在这里(。
我正在尝试创建一个子集数据框,该数据框将允许我运行线性回归分析,并且我正在尝试使用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()
,但对于我的生活,我不知道如何。(我想我以后总是可以学习更花哨的方法,但这是我现在要追求的方法,因为我已经理解了它。
很好地使用boxplot.stats
。
如果boxplot.stats
在$out
中返回多个异常值,则无法使用!=
安全地进行测试。这里的类比是1:5 != 1:3
.您可能想尝试!(1:5 %in% 1:3)
.
regressionFrame <- subset(regressionFrame,
subset = !(GrLivArea %in% boxplot.stats(GrLivArea)$out))
我所说的 SAFELY 是指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