【问题标题】:How do I obtain the outliers for each of my columns using a for loop?如何使用 for 循环获取每个列的异常值?
【发布时间】:2020-11-14 23:09:03
【问题描述】:

我有 571 列对应于 571 种不同的代谢物,还有一个带有参与者 ID 的列。使用下面的代码,我可以分别识别每个代谢物的异常值的参与者(平均值 +/- 3 * sd)。

  out<-data
       [which(
             data$Met1 > mean(data$Met1, na.rm=T) + 3* sd(data$Met1, na.rm=T) |
             data$Met1 > mean(data$Met1, na.rm=T) + 3* sd(data$Met1, na.rm=T)
            ),
            ]
                  

但是,我希望能够自动执行此操作,因此输出是一个包含 572 列的表,其中一个用于 ID 号,然后是 571 个代谢物的相应异常值(如果有),其中 NA 填充空格对于该 ID 没有异常值的代谢物。例如。

 ID     Met1     Met2    Met3...

 56     NA       0.145   NA
 72     0.09     0.07    NA
 98     NA       NA      0.0098

我正在处理 for 循环,但一直遇到错误。任何帮助将不胜感激。

 for ( i in 1:ncol(data[, 2:572]){
  outlier1 <-data[,i] > mean(data[,i]) + 3*sd(data[, i])
  outlier2 <- data[,i] > mean(data[,i]) - 3*sd(data[,i])
  need <- outlier1 + outlier2
  })
 

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    这是一个好方法:构建一个自定义函数,然后将其应用于您的列:

    ## custom function
    show_outliers = function(x) {
      my_mean = mean(x)
      my_sd = sd(x)
      is_outlier = (x > my_mean + 3 * my_sd) | (x < my_mean - 3 * my_sd)
      x[!is_outlier] = NA
      return(x)
    }
    
    ## intialize output
    out = data
    ## apply function to all columns except the first
    out[-1] = lapply(out[-1], show_outliers)
    

    如果你想修复你的 for 循环,我认为这会起作用:

    out <- data             ## work on out, don't modify data
    for (i in 2:ncol(out) { ## start at 2, go to ncol(out)
      outlier1 <- out[,i] > mean(out[,i]) + 3*sd(out[, i])
      outlier2 <- out[,i] > mean(out[,i]) - 3*sd(out[,i])
    
      ## your outlier1 and outlier2 are logical
      ## so we can combine them with OR |
      outliers <- outlier1 | outlier2 
      
      ## modify the data
      out[!all_outliers, i] <- NA
    } # delete extra )
    

    【讨论】:

      【解决方案2】:

      我们可以使用boxplot.stats 来查找异常值

      library(dplyr)
      data1 <- data %>% 
            mutate(across(-1, 
               ~ replace(., . %in% boxplot.stats(.)$out, NA)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 2020-10-09
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        相关资源
        最近更新 更多