首页 > 解决方案 > 如何在保留整个数据框的同时将函数应用于我的数据子集?

问题描述

我正在处理 NHL 球员的表现数据,并且有一个包含以下变量(以及其他变量)的数据框。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")在过去 3 年中平均打了少于 45 场比赛(weighted_games_played),那么我将考虑将他们视为替补守门员,并将他们的 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)

类似的东西?非常欢迎提出建议!

标签: r

解决方案


您可以使用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))

推荐阅读