Как рассчитать выбросы по столбцам в R? - PullRequest
0 голосов
/ 06 июля 2018

Мой код

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 голосов
/ 06 июля 2018

Чтобы получить индекс положения выбросов (на столбец):

pos <- lapply(df, FindOutliers)

Чтобы получить количество выбросов (на столбец):

lengths(pos)

Не рекомендуется работать с небольшим размером выборки. Скажем, в вашем примере df с размером выборки 6 только 851 определяется как выброс в последнем столбце, а 158 не выбирается.

0 голосов
/ 06 июля 2018

Вы можете сделать это с применением.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...