• R语言
  • 循环语句的判断条件报错?

查了好多包,都只能找出异常值或者给出异常值的位置,手动写了段代码能正常运行,使用Tukey法找出高值中的异常值并替换为-1:

# Tukey method outlier rmoval:
Tukey_outlier<-function(x){
    n<-length(x)
    sort_data<-x
    i<-1

  # caculate Tukey quartiles:

    b<-fivenum(x)
    Tukey_Critical<-b[4]+1.5*(b[4]-b[2])

  # replace outliers by -1:
    for(i in 1:n){
        if(sort_data[i]>Tukey_Critical){
            sort_data[i]<--1
        }
}
return(sort_data)
}

想节省运行开销,先对数据正序排列,不用全部都和Tueky Critical比较,当一个数据小于Tueky Critical时终止循环。但是这个写法就报错:

# Tukey method outlier rmoval:
Tukey_outlier2<-function(x){
    n<-length(x)
    sort_data<-sort(x)
    i<-n

   # caculate Tukey quartiles:

    b<-fivenum(x)
    Tukey_Critical<-b[4]+1.5*(b[4]-b[2])

   # replace outliers by -1:
    for(sort_data[i]>Tukey_Critical){
            sort_data[i]<--1
            i<-n-1
        }
return(sort_data)
}

报错信息:错误于source("Tukey_outlier2.r"): Tukey_outlier2.r:13:18: 意外的'['
12: # replace outliers by -1
13: for(sort_data[
^

看着像是循环语句的判断条件不能写类似sort_data>Tukey_Critical的形式吗?

稍微编辑了一下你的帖子格式,这样才能看清楚代码。论坛里的回复是支持markdown语法的,你这样直接复制的代码快进来很可能会最终显示的帖子格式错乱,可以在新手须知里查看下基本的排版方式。

    没看懂这里用循环的意义,直接向量计算不就可以了

    Tukey_outlier2<-function(x){
        n<-length(x)
        sort_data<-sort(x)
        i<-n
    
       # caculate Tukey quartiles:
    
        b<-fivenum(x)
        Tukey_Critical<-b[4]+1.5*(b[4]-b[2])
    
       # replace outliers by -1:
       # vectorized
    sort_data[sort_data > Tukey_Critical] = -1
    
    return(sort_data)
    }

    可以查看一下for的文档就会知道语法是for(var in seq) expr,所以是不支持你这样的写法的。但是话说回来如果你想的是讲一个向量中满足某个条件的元素值都替换成-1的话,那么根本不需要这么麻烦,直接方括号就可以。

    Tukey_outlier<-function(x){
      
      # caculate Tukey quartiles:
      b<-fivenum(x)
      Tukey_Critical<-b[4]+1.5*(b[4]-b[2])
      
      x[x > Tukey_Critical] <- -1
      return(x)
    }

    这个函数应该就可以了,也不需要排序什么的。

      Sylvanas
      那我就多说一句,你可以再去了解下R里面for循环的机制,因为我总感觉你的那个轮子里的i <- i + 1意义不明。

      Theseq in a for loop is evaluated at the start of the loop; changing it subsequently does not affect the loop. If seq has length zero the body of the loop is skipped. Otherwise the variable var is assigned in turn the value of each element of seq. You can assign to var within the body of the loop, but this will not affect the next iteration. When the loop terminates, var remains as a variable containing its latest value.

      for(i in 1 : 3){
        message("i before is: ", i)
        i <- i + 10
        message("i after is: ", i, "\n")
      }
      #> i before is: 1
      #> i after is: 11
      #> i before is: 2
      #> i after is: 12
      #> i before is: 3
      #> i after is: 13

      <sup>Created on 2024-09-14 with reprex v2.1.1</sup>

      4 天 后

      Sylvanas 没关系,没有谁一开始就是脚踩风火轮的大神,大家全都是踩着三角形的混凝土轮子一路磕磕巴巴走来的。