我试图通过向量逐步找到使用IQR计算范围的异常值。当我运行此脚本寻找IQR右侧的值时,我得到结果,当我向左运行时,我得到错误:缺少值,其中需要TRUE / FALSE。如何清除数据集中的true和false? 这是我的剧本:
data = c(100, 120, 121, 123, 125, 124, 123, 123, 123, 124, 125, 167, 180, 123, 156)
Q3 <- quantile(data, 0.75) ##gets the third quantile from the list of vectors
Q1 <- quantile(data, 0.25) ## gets the first quantile from the list of vectors
outliers_left <-(Q1-1.5*IQR(data))
outliers_right <-(Q3+1.5*IQR(data))
IQR <- IQR(data)
paste("the innner quantile range is", IQR)
Q1 # quantil at 0.25
Q3 # quantile at 0.75
# show the range of numbers we have
paste("your range is", outliers_left, "through", outliers_right, "to determine outliers")
# count ho many vectors there are and then we will pass this value into a loop to look for
# anything above and below the Q1-Q3 values
vectorCount <- sum(!is.na(data))
i <- 1
while( i < vectorCount ){
i <- i + 1
x <- data[i]
# if(x < outliers_left) {print(x)} # uncomment this to run and test for the left
if(x > outliers_right) {print(x)}
}
我得到的错误是
[1] 167
[1] 180
[1] 156
Error in if (x > outliers_right) { :
missing value where TRUE/FALSE needed
正如你可以看到你运行这个脚本,它是在右边找到我的3个异常值并且还抛出错误,但是当我在IQR的左边再次运行它时,我确实有一个100的异常值向量,我只是得到错误而没有显示其他结果。 我该如何修复这个脚本?任何帮助非常感谢。几天来,我一直在搜索网络和我的书籍如何解决这个问题。
答案 0 :(得分:3)
如评论中所述,错误是由于您构建while
循环的方式。在最后一次迭代中,i == 16
虽然只有15个要处理的元素。从i <= vectorCount
更改为i < vectorCount
可解决问题:
i <- 1
while( i < vectorCount ){
i <- i + 1
x <- data[i]
# if(x < outliers_left) {print(x)} # uncomment this to run and test for the left
if(x > outliers_right) {print(x)}
}
#-----
[1] 167
[1] 180
[1] 156
然而,这实际上不是R的工作方式,并且您很快就会对代码运行多长时间的数据感到沮丧。 R是“矢量化”意味着您可以同时对data
的所有15个元素进行操作。要打印你的异常值,我会这样做:
data[data > outliers_right]
#-----
[1] 167 180 156
或者使用OR运算符立即获取所有这些:
data[data< outliers_left | data > outliers_right]
#-----
[1] 100 167 180 156
对于一个小上下文,上面的逻辑比较为data
的每个元素创建一个布尔值,R只返回那些为TRUE的值。您可以输入以下内容自行检查:
data > outliers_right
#----
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
[
位实际上是一个提取运算符,用于检索数据对象的子集。有关优秀背景的信息,请参阅帮助页面?"["
。
答案 1 :(得分:1)
出现错误消息是因为您允许i <= vectorCount
使i
等于vectorCount
,因此从数据中索引i = i+1
将提供NA
,并且if
语句将失败。
如果您想根据IQR找到异常值,可以使用findInterval
outliers <- data[findInterval(data, c(Q1,Q3)) != 1]
我也会停止使用paste
创建字符消息为printed
,而是使用message
。