Определить выбросы в кадре данных в R - PullRequest
0 голосов
/ 17 июня 2019

Текущий фрейм данных состоит из числовых значений.Я определяю выбросы в столбце данных по столбцу за столбцом. Могу ли я сразу определить выбросы в столбце и удалить их за один раз?Сейчас я меняю значения на NA

Мой код:

    quantiles<-tapply(var1,names,quantile) 
    minq <- sapply(names, function(x) quantiles[[x]]["25%"])
    maxq <- sapply(names, function(x) quantiles[[x]]["75%"])
    var1[var1<minq | var1>maxq] <- NA

Данные.

Данные, опубликованные ФП в комментарии вdput формат.

df1 <-
structure(list(Var1 = c(100.2, 110, 200, 456, 120000), 
var2 = c(NA, 4545L, 45465L, 44422L, 250000L), 
var3 = c(NA, 210000L, 91500L, 215000L, 250000L), 
var4 = c(0.983, 0.44, 0.983, 0.78, 2.23)), 
class = "data.frame", row.names = c(NA, -5L))

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Следующая функция проверяет, какие значения в столбцах находятся за пределами заборов Тьюки (выбросы ниже и выше 1-го и 3-го квартиля).Затем, в зависимости от предпочтений пользователя, функция удаляет все строки, содержащие любое значение с выбросом, или заменяет выбросы на NA.

outlier.out <- function(dat, q = c(0.25, 0.75), out = TRUE){
    # create a place for identification of outliers
    tests <- matrix(NA, ncol = ncol(dat), nrow = nrow(dat))
    # test, which cells contain outliers, ignoring existing NA values
    for(i in 1:ncol(dat)){
        qq <- quantile(dat[, i], q, na.rm = TRUE)
        tests[, i] <- sapply(dat[, i] < qq[1] | dat[, i] > qq[2], isTRUE)
    }
    if(out){
        # removes lines with outliers
        dat <- dat[!apply(tests, 1, FUN = any, na.rm = TRUE) ,]
    } else {
        # replaces outliers with NA
        dat[tests] <- NA
    }
    return(dat)
}

outlier.out(df1)
#   Var1  var2   var3 var4
# 4  456 44422 215000 0.78


outlier.out(df1, out = FALSE)
#   Var1  var2   var3  var4
# 1   NA    NA     NA 0.983
# 2  110    NA 210000    NA
# 3  200 45465     NA 0.983
# 4  456 44422 215000 0.780
# 5   NA    NA     NA    NA
.
0 голосов
/ 17 июня 2019

Следующее удаляет выбросы из фрейма данных, но в результате получается список , а не фрейм данных, поскольку результирующие векторы имеют разную длину.

df2 <- lapply(df1, function(x){
  qq <- quantile(x, c(0.25, 0.75), na.rm = TRUE)
  x[!is.na(x) & qq[1] <= x & x <= qq[2]]
})

Редактировать

После того, как этот вопрос от того же @ user11368874 , приведенный ниже код вдохновлен первым кодом выше и отвечает на второй вопрос.

df3 <- df1
df3[] <- lapply(df1, function(x){
  qq <- quantile(x, c(0.25, 0.75), na.rm = TRUE)
  is.na(x) <-  x < qq[1] | x > qq[2]
  x
})

df3
#  Var1  var2   var3  var4
#1   NA    NA     NA 0.983
#2  110    NA 210000    NA
#3  200 45465     NA 0.983
#4  456 44422 215000 0.780
#5   NA    NA     NA    NA
...