Проблема:
У меня есть DataFrame, состоящий исключительно из переменных, которые имеют числовой тип данных.У меня есть процедура, которая хорошо выполнила в прошлом проверку каждой переменной в DataFrame на предмет статистических выбросов и замену любых идентифицированных выбросов значениями NA.Однако в этой подпрограмме используются недавно устаревшие функции fun ().
Изучив эту проблему, я знаю, что вы должны в принципе заменить funs () на list (~ example_func ()) например:
>funs(mean(., trim = .2), median(., na.rm = TRUE))
>
>Would become:
>
>list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
К сожалению, это средство не работает в моем случае использования.
Функциональный, но теперь устаревший код:
Следующий кодработает, как показано ниже (для переменных с выбросами выбросы заменяются значениями NA);однако, это вызывает предупреждение относительно теперь мягко осуждаемых funs ():
> # Which variables have missing values
> sapply(training_imptd, function(x) sum(is.na(x)))
INDEX TARGET_WINS TEAM_BATTING_H TEAM_BATTING_2B TEAM_BATTING_3B
0 0 0 0 0
TEAM_BATTING_HR TEAM_BATTING_BB TEAM_BATTING_SO TEAM_BASERUN_SB TEAM_BASERUN_CS
0 0 102 131 772
TEAM_BATTING_HBP TEAM_PITCHING_H TEAM_PITCHING_HR TEAM_PITCHING_BB TEAM_PITCHING_SO
2085 0 0 0 102
TEAM_FIELDING_E TEAM_FIELDING_DP
0 286
>
> # Identify outliers and set them to NA (NAs to be fixed in next step by mice)
> training_imptd <- training_imptd %>%
+ mutate_all(
+ funs(ifelse(. %in% boxplot.stats(training_imptd$.)$out, NA, .))
+ )
>
> Warning: funs() is soft deprecated as of dplyr 0.8.0
> Please use a list of either functions or lambdas:
>
> # Simple named list:
> list(mean = mean, median = median)
>
> # Auto named with `tibble::lst()`:
> tibble::lst(mean, median)
>
> # Using lambdas
> list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
> This warning is displayed once per session.
>
> # Which variables have missing values (after imputing NA for outliers)
> sapply(training_imptd, function(x) sum(is.na(x)))
INDEX TARGET_WINS TEAM_BATTING_H TEAM_BATTING_2B TEAM_BATTING_3B
0 32 67 15 29
TEAM_BATTING_HR TEAM_BATTING_BB TEAM_BATTING_SO TEAM_BASERUN_SB TEAM_BASERUN_CS
0 129 102 252 827
TEAM_BATTING_HBP TEAM_PITCHING_H TEAM_PITCHING_HR TEAM_PITCHING_BB TEAM_PITCHING_SO
2086 213 4 90 140
TEAM_FIELDING_E TEAM_FIELDING_DP
303 318
Исправленный код, который должен работать, но не работает:
На основании того, что я 'Читая о замене funs () на list (~ example_func ()), я ожидаю, что следующий код будет работать точно так же, как и код выше, который использует funs (), но это не так (для переменных с выбросами выбросы НЕ являютсязаменены значениями NA):
> # Which variables have missing values
> sapply(training_imptd, function(x) sum(is.na(x)))
INDEX TARGET_WINS TEAM_BATTING_H TEAM_BATTING_2B TEAM_BATTING_3B
0 0 0 0 0
TEAM_BATTING_HR TEAM_BATTING_BB TEAM_BATTING_SO TEAM_BASERUN_SB TEAM_BASERUN_CS
0 0 102 131 772
TEAM_BATTING_HBP TEAM_PITCHING_H TEAM_PITCHING_HR TEAM_PITCHING_BB TEAM_PITCHING_SO
2085 0 0 0 102
TEAM_FIELDING_E TEAM_FIELDING_DP
0 286
>
> # Identify outliers and set them to NA (NAs to be fixed in next step by mice)
> training_imptd <- training_imptd %>%
+ mutate_all(
+ list(~ ifelse(. %in% boxplot.stats(training_imptd$.)$out, NA, .))
+ )
>
> # Which variables have missing values (after imputing NA for outliers)
> sapply(training_imptd, function(x) sum(is.na(x)))
INDEX TARGET_WINS TEAM_BATTING_H TEAM_BATTING_2B TEAM_BATTING_3B
0 0 0 0 0
TEAM_BATTING_HR TEAM_BATTING_BB TEAM_BATTING_SO TEAM_BASERUN_SB TEAM_BASERUN_CS
0 0 102 131 772
TEAM_BATTING_HBP TEAM_PITCHING_H TEAM_PITCHING_HR TEAM_PITCHING_BB TEAM_PITCHING_SO
2085 0 0 0 102
TEAM_FIELDING_E TEAM_FIELDING_DP
0 286