如果不满足条件,在mutate()中使用if_else()时希望保留原始值

问题描述 投票:0回答:1

我有下面的代码行,我试图更改数据帧中不同位置(QB,RB,WR,TE)的fpts值,但对于其他两个位置(DST,K则保持相同) )。如果运行此命令,则fpts的QB,RB,WR,TE位置值会更改,但是DST和K fpts会更改为0。您知道为什么会这样吗? fpts列中已经有所有位置的值,但是我只想更改我提到的这四个位置的fpts值。

library(tidyverse)
library(dplyr)

projections <-read_csv("https://raw.githubusercontent.com/samhoppen/2020_FF_Analysis/master/Functions/Projections.csv")

projections <- projections %>% 
     mutate(fpts = (if(position == "QB" || position == "RB" || position == "WR" || position == "TE"){
                             (pass_yds * 0.1) +
                                 (pass_tds * 4) +
                                 (pass_ints * -2) +
                                 (rush_yds * 0.1) +
                                 (rush_tds * 6) + 
                                 (fl * -2) +
                                 (rec_rec * 1) +
                                 (rec_yds * 0.1) +
                                 (rec_tds * 6)}
              else{fpts}))
r if-statement dplyr mutate
1个回答
1
投票

我们可以使用case_when/ifelse而不是if/else,因为if/else没有被向量化,即它期望单个元素而不是整个列

library(dplyr)
projections %>%
    mutate(fpts = case_when(position %in% c('QB', 'RB', 'WR', 'TE')~ 
     (pass_yds * 0.1) +
                             (pass_tds * 4) +
                             (pass_ints * -2) +
                             (rush_yds * 0.1) +
                             (rush_tds * 6) + 
                             (fl * -2) +
                             (rec_rec * 1) +
                             (rec_yds * 0.1) +
                             (rec_tds * 6), TRUE ~ fpts))
# A tibble: 790 x 16
#   player team  position pass_att pass_cmp pass_yds pass_tds pass_ints rush_att rush_yds rush_tds    fl  fpts
#   <chr>  <chr> <chr>       <dbl>    <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>    <dbl> <dbl> <dbl>
# 1 Lamar… BAL   QB           465.     297.    3465.     29.8      11.9    156.     968.       5.5   4.1  564.
# 2 Patri… KC    QB           558.     361     4453.     33.3       9.8     72.3    353.       3.7   3.5  609.
# 3 Dak P… DAL   QB           558.     363     4463.     28.6      12.4     53.4    269.       3.8   3.3  579.
# 4 Desha… HOU   QB           515.     339.    3997.     25.3      14.8     94.8    509.       5.1   3.7  545.
# 5 Russe… SEA   QB           478.     312     3842.     29.2       8.5     77.7    414.       2.5   2.9  535.
# 6 Kyler… ARI   QB           542.     349.    3733.     24.9      15.1     94.9    525        3.7   2.7  512.
# 7 Josh … BUF   QB           510.     299.    3479.     20.1      13.8    106.     612.       7.2   5.2  495.
# 8 Tom B… TB    QB           559      347.    4447.     29.3      11.8     25.7     32.3      1.8   2.6  547.
# 9 Matt … ATL   QB           621.     407.    4604.     27.6      14.9     33      128.       1     4.6  551.
#10 Drew … NO    QB           517.     365.    3889      30.5       9.5     19.7     21.7      1.7   1.8  501.
# … with 780 more rows, and 3 more variables: rec_rec <dbl>, rec_yds <dbl>, rec_tds <dbl>

注意:首先在此处发布%in%

© www.soinside.com 2019 - 2024. All rights reserved.