我在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()
,但对于我的一生,我不知道该怎么做。 (我认为以后总是可以学习更高级的方法,但这是我现在所要学习的方法,因为我已经理解了。)
答案 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