由于内置和第三方包的Dixon test都只能检测30个以下数据的异常值,手上的数据有1500多个,手搓了一个函数(虽然我也知道Dixon test检测异常值最好用于30个以下样本量,但是找不到其它更好的方法了。。。。)
造的轮子有时能正常跑,有时换个工作目录都会报错。刚才又试了下,没换工作目录都报错了。。。。玄学吗?
test data

造的轮子:

# only for upper Dixon outlier detection, after removing outliers, n>=31
Dixon_outlier<-function(x)
{
 n<-length(x)-2
 i<-1
 x<-sort(x, decreasing = TRUE)
 for(i in 1:n){

#calculate Dixon critical
 
   Dixon_critical<-(x[i]-x[i+2])/(x[i]-x[n-2])
   if(Dixon_critical == "NaN"){
      break
   }
 
 # outlier will be subsituted by NA
 
   else if (Dixon_critical>0.254) {
      x[i]<-NA
      i<-i+1
      Dixon_critical<-(x[i]-x[i+2])/(x[i]-x[n-2])
 }
   else {
      break
   }
 }

 return(x)
}

报错信息:

错误于if (Dixon_critical == "NaN") {: 
 需要TRUE/FALSE值的地方不可以用缺少值

更新测试过程中遇到的更奇怪的问题:
手工直接r<-Dixon_outlier(test_data$mRBC)会报这个错误,但是取出第一列先sort再用函数就不会报错。。。。
可是我写的函数一开始就先进行降序排列了啊

请版主关贴,突然发现问题所在了。。。能正常跑的时候输入的数据框是各列等长的,一旦各列不等长,R似乎会填充NA,导致运行过程中出现这个报错。。。。