Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取[R]中的错误-缺少需要TRUE/FALSE的值_R_Na - Fatal编程技术网

获取[R]中的错误-缺少需要TRUE/FALSE的值

获取[R]中的错误-缺少需要TRUE/FALSE的值,r,na,R,Na,我试图通过一个向量来找到异常值,使用IQR来计算范围。当我运行这个脚本在IQR的右边寻找值时,我得到了结果,当我运行到左边时,我得到了错误:缺少需要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 f

我试图通过一个向量来找到异常值,使用IQR来计算范围。当我运行这个脚本在IQR的右边寻找值时,我得到了结果,当我运行到左边时,我得到了错误:缺少需要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)}
}
正如你所看到的,如果你运行这个脚本,它会在右边找到我的3个异常值,也会抛出错误,但是当我在IQR的左边再次运行这个脚本时,我的向量中有一个100的异常值,我只得到了错误,没有显示其他结果。
如何修复此脚本?非常感谢您的帮助。我已经在网上和我的书上搜寻了好几天,想知道如何解决这个问题。

错误消息是因为你让我而产生的。错误消息是因为你让我正如评论中所指出的,错误是由于你构建while循环的方式。在最后一次迭代中,i==16,尽管只有15个元素需要处理。如注释中所述,更改为i,错误是由于您构建while循环的方式造成的。在最后一次迭代中,i==16,尽管只有15个元素需要处理。从i=16更改会产生错误。切换i您正在切换该语句的位置,以便它在比较之后出现。在添加1和索引之前,让i等于向量数据的长度,因此它返回NA,如果语句逻辑语句失败,则i=16会出错。切换i您正在切换该语句的位置,以便它在比较之后出现。您让我在添加1之前等于向量数据的长度,然后添加索引,因此它返回NA。如果语句逻辑语句失败,则Hanks,我对R是新手,但对其他语言略为熟悉,因此只需了解其细微差别。谢谢,我对R不熟悉,但对其他语言略知一二,所以我只是想通过它的细微差别找到自己的方法。我知道很多人认为去除异常值在统计学中是一种不好的做法,但在野外生物学领域,不管怎样,要更好地理解全局,需要去除异常值——我找到了一种比数据更容易的方法[dataoutliers_right]我发现这种方法更有效,它还允许我将值传递到其他函数,如直方图和图。x[!x%in%boxplot.statsx$out]@JohnP.Newbury-直接调用boxplot.stats非常好。如果你看一下这个函数的源代码,你会发现它基本上调用了我上面的答案。@JohnP.Newbury-还有,为了它的价值-stackOverflow鼓励你回答你自己的问题…如果这是你认为最好的答案,就接受它…评论可能会被删除/删除/或者人们可能不会像阅读答案一样多地阅读它们。我知道很多人认为在统计中删除异常值是不好的做法,但在野外生物学领域,需要去除异常值才能更好地理解全局——我找到了一种比数据更容易的方法[dataoutliers_right]我发现这更有效,它还允许我将值传递到其他函数,如直方图和绘图。x[!x%in%boxplot.statsx$out]@JohnP.Newbury-直接调用boxplot.stats非常好。如果你看一下这个函数的源代码,你会发现它基本上调用了我上面的答案。@JohnP.Newbury-还有,为了它的价值-stackOverflow鼓励你回答你自己的问题…如果这是你认为最好的答案,就接受它…评论可能会被删除/删除/或者人们可能只是没有自己阅读答案那么多。
[1] 167
[1] 180
[1] 156
Error in if (x > outliers_right) { : 
missing value where TRUE/FALSE needed
outliers <- data[findInterval(data, c(Q1,Q3)) != 1]
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
data[data > outliers_right]
#-----
[1] 167 180 156
data[data< outliers_left | data > outliers_right]
#-----
[1] 100 167 180 156
data > outliers_right
#----
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE