代码之家  ›  专栏  ›  技术社区  ›  Shubh

如何在r中按列计算异常值?

r
  •  1
  • Shubh  · 技术社区  · 6 年前

    我的代码

    dat <- read.csv("numeric.csv")
    dat1 <- na.omit(dat)
    
    ##Function to calculate outliers
    FindOutliers <- function(data) {
      lowerq = quantile(data)[2]
      upperq = quantile(data)[4]
      iqr = upperq - lowerq #Or use IQR(data)
      # we identify extreme outliers
      extreme.threshold.upper = (iqr * 3) + upperq
      extreme.threshold.lower = lowerq - (iqr * 3)
      result <- which(data > extreme.threshold.upper | data < extreme.threshold.lower)
    }
    
    
    out_dat <- names(dat1)
    out_dat <- as.data.frame(out_dat)
    
    for (dat in seq_along(dat1)){
      temp <- FindOutliers(dat)
      out_dat$outlier_count <- length(temp)
    }
    

    如果单独传递每一列,我可以得到异常值,但是通过传递整个数据帧,我无法重现相同的结果。

    样本数据集

    df <- read.table(text = "
        var1 var2 var3 var4 var5 var6 var7
    a      1    1   10   10    1    1    1
    b     10    1    1    1    1    1    851
    c      1    1    1    1    1    1    158
    d      1    1011    1    1    1    5    1
    e      1    1    55    1    9    1    1
    f      1    1    1    1    1    781    1
    ", header = TRUE)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Zheyuan Li    6 年前

    要获取离群值的位置索引(每列):

    pos <- lapply(df, FindOutliers)
    

    要获取异常值的数目(每列):

    lengths(pos)
    

    使用小样本不是一个好主意。举个例子 df 在样本量为6的情况下,在最后一列中只有851个被检测为异常值,而158个没有被挑选出来。

        2
  •  1
  •   Benjamin Schlegel    6 年前

    你可以用apply来做。

    FindOutliers <- function(data) {
      lowerq = quantile(data)[2]
      upperq = quantile(data)[4]
      iqr = upperq - lowerq #Or use IQR(data)
      # we identify extreme outliers
      extreme.threshold.upper = (iqr * 3) + upperq
      extreme.threshold.lower = lowerq - (iqr * 3)
      result <- which(data > extreme.threshold.upper | data < extreme.threshold.lower)
      length(result)
    }
    apply(df, 2, FindOutliers)