如何通过R中的列计算离群值?

时间:2018-07-06 10:35:09

标签: r

我的代码

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 个答案:

答案 0 :(得分:1)

您可以通过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)

答案 1 :(得分:1)

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

"Capabilities - Send and receive instant messages and photos"

要获取离群数(每列):

pos <- lapply(df, FindOutliers)

使用小样本量不是一个好主意。假设您的示例lengths(pos) 的样本量为6,在最后一列中仅检测到851作为离群值,而没有选择158。