Как мне применить функцию к подмножеству моих данных, сохраняя при этом весь фрейм данных?

#r

#r

Вопрос:

Я работаю с данными о производительности игроков НХЛ, и у меня есть фрейм данных со следующими переменными (среди прочих). war_lost — это показатель ценности игрока, потерянный за весь сезон из-за травмы игрока. Данные охватывают 9 сезонов, с 2009-2010 по 2017-2018 годы.

    first_name last_name position_new season    team    weighted_games_played war_lost
   <chr>      <chr>     <chr>        <chr>     <chr>                   <dbl>    <dbl>
 CAREY      PRICE     G            2015-2016 MTL                      48.7     6.40
 SIDNEY     CROSBY    F            2011-2012 PIT                      48.6     5.59
 SIDNEY     CROSBY    F            2010-2011 PIT                      64.8     3.88
 COREY      CRAWFORD  G            2017-2018 CHI                      47.6     3.63
 JONATHAN   QUICK     G            2016-2017 LAK                      50.1     3.30
 STEVEN     STAMKOS   F            2013-2014 TBL                      41.0     2.81
 HENRIK     LUNDQVIST G            2014-2015 NYR                      76.9     2.30
 CONNOR     MCDAVID   F            2015-2016 EDM                      45.0     2.20
 ZACH       PARISE    F            2010-2011 NJD                      46.4     1.98
 JOHN       GIBSON    G            2014-2015 ANA                      23.0     1.96
 JOHAN      FRANZEN   F            2009-2010 DET                      39.0     1.94
 VIKTOR     FASTH     G            2013-2014 ANA                      18.0     1.89
 ANTON      KHUDOBIN  G            2013-2014 CAR                      36.0     1.86
 TOMAS      HERTL     F            2013-2014 SJS                      44.0     1.84
 STEVEN     STAMKOS   F            2016-2017 TBL                      43.3     1.82
 JONAS      HILLER    G            2010-2011 ANA                      53.6     1.80
 CAM        WARD      G            2009-2010 CAR                      46.0     1.78
 PAUL       MARTIN    D            2009-2010 NJD                      27.0     1.72
 ANTTI      RAANTA    G            2017-2018 ARI/PHX                  36.6     1.62
 LUBOMIR    VISNOVSKY D            2013-2014 NYI                      54.4     1.50
  

Если вратарь (position_new == "G") сыграл в среднем менее 45 игр за предыдущие 3 года (weighted_games_played) , я буду считать его запасным вратарем и умножу его war_lost на коэффициент x, чтобы учесть количество игр, которые он, вероятно, сыграет, из игр, которые он пропустил из-за травмы.

Если вратарь сыграл в среднем более 45 игр за предыдущие 3 года, я буду считать его начинающим вратарем и умножу его war_lost на коэффициент y, чтобы учесть количество игр, которые он, вероятно, сыграет, из игр, которые он пропустил из-за травмы.

Я рассмотрел несколько различных методов (написание пользовательской функции, ifelse() , метод purrr), но мне трудно обернуть услышанное вокруг некоторых основополагающих принципов, в основном о том, как я должен сохранять все свои данные, элегантно изменяя наблюдения, которые являются целями. Возможно, что-то вроде:

 data <- data %>%
    ifelse(position == "G",
           ifelse(weighted_games_played < 45, mutate(war_lost = 0.4 * war_lost), 
           mutate(war_lost = 0.6 * war_lost)),
           DO NOTHING IF NOT G)
  

Что-то в этом роде? Предложения приветствуются!

Ответ №1:

Вы можете использовать dplyr::case_when . Если вызываются ваши данные df , вы можете использовать следующий код

 library(dplyr)
df %>% 
  mutate(war_lost = 
            case_when(position == 'G' amp; weighted_games_played < 45
                        ~ 0.4*war_lost,
                      position == 'G' 
                        ~ 0.6*war_lost,
                      T ~ war_lost))