Выявление выбросов с использованием диапазона Quartile - PullRequest
0 голосов
/ 17 июня 2019

У меня есть датафрейм, который состоит из числовых значений с 22 столбцами.Когда я делаю резюме (df) по нему, получаю детали (мин, макс, среднее, медиана, 1 и 3 квартили).Теперь я хочу получить 1 и 3 квартили для каждого столбца.Все, что выше или ниже, будет Outlier, и я хотел бы заменить Outlier значением NA.

Summary :
 Var 1                 Var2             Var 3                Var 4                             
 Min.   : 0      Min.   :0       Min : 0           Min : -127.00           
 1st Qu.: 1208   1st Qu.: 1150  1st Qu.: 135000   1st Qu.: 98      
 Median : 1400   Median : 1300   Median : 180000   Median : 99      
 Mean   : 1617   Mean   : 2138   Mean   : 211759   Mean   : 96.59      
 3rd Qu.: 1990   3rd Qu.: 2500   3rd Qu.: 250000   3rd Qu.: 100      
 Max.   :10000   Max  :4000   Max.   :40000   Max:9999.

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

1 Ответ

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

Длинный и прокомментированный способ сделать это, есть тысячи:

### take the Q1 - Q3 values (you could also use quantile function where you can choose methods to get quantile) 
q1 <- as.numeric(summary(old_vector)[2])
q3 <- as.numeric(summary(old_vector)[5])

new_vector <- vector()
for (value in old_vector) {
  if ( !is.na(value) && (value < q1 || value > q3) ) new_vector <- append(new_vector, NA)
  else new_vector <- append(new_vector, value)
}

отредактировано, как вы прокомментировали:

Конечно, он может работать с такими структурами:

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

### declare the function to replace a vector outliers based on IQR boundaries
replace_outliers <- function (old_vector) {
    q1 <- as.numeric(summary(old_vector)[2])
    q3 <- as.numeric(summary(old_vector)[5])
    new_vector <- vector()
    for (value in old_vector) {
      if ( !is.na(value) && (value < q1 || value > q3) ) new_vector <- append(new_vector, NA)
      else new_vector <- append(new_vector, value)
    }
    return(new_vector)
}

### open loop on DF columns
for ( col in colnames(df1) ) {
    ### create new column name
    name_new_col <- paste( col, "_replaced", sep = "" )
    ### put the replaced values in the new column
    df1[,name_new_col] <- replace_outliers(df1[,col])
}

и у вас будет DF с новыми столбцами «Var [n] _replaced» с NA вместо выбросов IQR

...