Обнаружение выбросов и переименование в NA, используя dplyr в длинном формате - PullRequest
0 голосов
/ 25 октября 2019

Я новичок в программировании на R и застрял с проблемой. Я хочу обнаружить и затем переименовать выбросы в набор данных как «NA», но не смог найти способ сделать это правильно. Я преобразую свой набор данных с функцией melt в длинный формат, а затем использую функцию «isnt_out_tukey» (правило 1.5xIQR) из (http://www.questionflow.org/2017/12/26/combined-outlier-detection-with-dplyr-and-ruler/).

) В результате получается новый столбец с логическими выражениями («TRUE», «FALSE "). Но мне нужно, чтобы в этом новом столбце остались все значения, не являющиеся выбросами (isnt_out_tukey), и установите все выбросы на" NA ".

Исключение выбросов должно быть сгруппировано по c_year, country и variable!

Второй вопрос, который носит более общий характер: как выполнить функцию выброса только для определенных переменных (строк) в столбце «переменная» (т. Е. Только для var_01 и var_02) и оставить другие значения без изменений вНедавно созданный столбец.

Любая помощь высоко ценится!

library(dplyr) 
library(reshape2)

isnt_out_tukey <- function(x, k = 1.5, na.rm = TRUE) {
quar <- quantile(x, probs = c(0.25, 0.75), na.rm = na.rm)
iqr <- diff(quar)
(quar[1] - k * iqr <= x) & (x <= quar[2] + k * iqr)
}

set.seed(23)
df <- data.frame(
c_year= c("2014", "2015", "2015", "2015", "2014", "2015", "2014", "2014", 
"2015", "2014", "2015", "2015", "2014", "2014", "2015", "2014", "2015"),
group = c("0","0","1","0","1","0","1","1","1","1","1", "0", "1", 
"1","0","1","1"),
country = c("A", "B", "C", "B", "A", "C", "B", "C", "B", "C", "B", "A", 
"B", "A", "C", "B", "C"),
var_01 = c(rnorm(15), 2, 5),
var_02 = c(rnorm(16), 18),
var_03 = c(rnorm(15), 2.5, 10),
var_04 = c(rnorm(14), 2, 3, 6),stringsAsFactors = F)

df_long <- melt(df, id.vars = c("c_year", "group", "country"), 
variable.name = "variable", value.name = "variable_value")

df_long <- df_long %>% 
group_by(c_year, country, variable) %>%
mutate(out_removal = isnt_out_tukey(variable_value))

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Предполагая, что функция isnt_out_tukey правильно идентифицирует выбросы, которые вы хотите исключить, вы можете использовать что-то вроде:

df_long <- df_long %>% 
      group_by(c_year, country, variable) %>%
      mutate(good = ifelse(isnt_out_tukey(variable_value), variable_value, NA))

head(df_long,10)

# A tibble: 10 x 6
# Groups:   c_year, country, variable [5]
   c_year group country variable variable_value    good
   <chr>  <chr> <chr>   <fct>             <dbl>   <dbl>
 1 2014   0     A       var_01           0.193   0.193 
 2 2015   0     B       var_01          -0.435  -0.435 
 3 2015   1     C       var_01           0.913   0.913 
 4 2015   0     B       var_01           1.79   NA     
 5 2014   1     A       var_01           0.997   0.997 
 6 2015   0     C       var_01           1.11    1.11  
 7 2014   1     B       var_01          -0.278  -0.278 
 8 2014   1     C       var_01           1.02    1.02  
 9 2015   1     B       var_01           0.0454  0.0454
10 2014   1     C       var_01           1.58    1.58  

В ответ на второй вопрос вы можете скопировать все значения, а затем использовать filter(df_long, variable == "var_01") и сделайте второй звонок, чтобы изменить вашу замену. Или вы можете использовать другой оператор ifelse, чтобы ограничить использование функции isnt_out_tukey переменной (ами), которую вы хотите. Третий (возможно, менее удачный) вариант - это фильтр до того, как вы переведете данные в длинный формат.

0 голосов
/ 25 октября 2019

Я думаю, что легче обнаружить и заменить основной файл, а затем преобразовать его в длинный формат.

library(dplyr)
#Since you don't have outliers in the OP df, I used iris
iris %>% group_by(Species) %>% 
         mutate(Sepal.Length=ifelse(row_number()<5, 10000, Sepal.Length)) %>%
         mutate_at(vars(Sepal.Length,Sepal.Width), list(~replace(.,!isnt_out_tukey(.),NA)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...