Unique Challenge Replacing Soft-deprecated funs () - PullRequest
4 голосов
/ 22 сентября 2019

Проблема:

У меня есть 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 

1 Ответ

1 голос
/ 22 сентября 2019

Удалите ненужные training_imptd$ изнутри вашей функции.Местоимение . уже относится к «текущему столбцу», поэтому вы можете передать его непосредственно в boxplot.stats():

training_imptd %>%
  mutate_all(
    ~ifelse(. %in% boxplot.stats(.)$out, NA, .)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...