如何在保留整个数据框的同时将功能应用于数据的子集?

时间:2019-04-10 16:16:23

标签: r

我正在使用NHL播放器性能数据,并具有一个包含以下变量的数据框(以及其他变量)。 war_lost是衡量由于球员受伤而整个赛季损失的球员价值的指标。该数据涵盖了从2009-2010年到2017-2018年的9个季节。

   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")在过去三年中(weighted_games_played)平均只打了不到45场比赛,那么我将认为他们是备用守门员,并将他们的war_lost乘以系数x来说明他们可能因受伤而缺席的比赛数。

如果守门员在过去3年中平均踢了45场比赛,那么我将认为他们是首发守门员,并将他们的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 个答案:

答案 0 :(得分:1)

您可以使用dplyr::case_when。如果您的数据称为df,则可以使用以下代码

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