【问题标题】:R: if_else, ifelseR: if_else, ifelse
【发布时间】:2019-10-09 13:47:14
【问题描述】:

我是 R 的新手,并且在很长一段时间后才开始使用它。 我从该站点获得了 NFL 第 1 周的数据,并尝试执行一个小的 ifelse,但它不起作用。 我想要结果字段中的团队名称

#this works only when condition is true and doesn't when condition is false
wk1$tm_won= if_else(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)  

#this doesn't work - gives me the difference
wk1$tm_won1 <- ifelse(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)

#this doesn't work - gives me difference and not the team name
wk1 %>%
    mutate(tm_won2 = ifelse (home_score < away_score, away_team,
                     ifelse (home_score > away_score, home_team, NA)))
#this doesn't work 
wk1 %>%
    mutate(tm_won = case_when(
        home_score < away_score ~ away_team,
        home_score > away_score ~ home_team,
        TRUE ~ a ))# DRAW

我的结果数据集:

season  week    home_team   away_team   home_score  away_score  tm_won  tm_won1 tm_won2
2019    1   CHI GB  3   10  GB  7   7
2019    1   CAR LA  27  30  LA  11  11
2019    1   PHI WAS 32  27  <NA>    14  14
2019    1   NYJ BUF 16  17  BUF 3   3
2019    1   MIN ATL 28  12  <NA>    9   9

【问题讨论】:

  • 你能详细说明这里的“不起作用”是什么意思吗?
  • 数据中看起来像字符串的内容可能是因素。将数据读取为字符串,或将因子转换为字符串。然后你的代码就可以工作了。

标签: r if-statement


【解决方案1】:

这里发生的情况是,您的团队实际上是 factors(实际上只是 integer 向量)而不是 characters。如果列是characters,则基本上您的所有解决方案都按预期工作。输出不同的原因是因为dplyr 试图巧妙地处理因子,并尽可能保持人类可读。


library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

wk1 <- read.table(text = 'season  week    home_team   away_team   home_score  away_score  tm_won  tm_won1 tm_won2
                  2019    1   CHI GB  3   10  GB  7   7
                  2019    1   CAR LA  27  30  LA  11  11
                  2019    1   PHI WAS 32  27  <NA>    14  14
                  2019    1   NYJ BUF 16  17  BUF 3   3
                  2019    1   MIN ATL 28  12  <NA>    9   9', header = T, stringsAsFactors = FALSE)

if_else(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)  
#> [1] "GB"  "LA"  "PHI" "BUF" "MIN"

ifelse(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)
#> [1] "GB"  "LA"  "PHI" "BUF" "MIN"

wk1 <- read.table(text = 'season  week    home_team   away_team   home_score  away_score  tm_won  tm_won1 tm_won2
                  2019    1   CHI GB  3   10  GB  7   7
                  2019    1   CAR LA  27  30  LA  11  11
                  2019    1   PHI WAS 32  27  <NA>    14  14
                  2019    1   NYJ BUF 16  17  BUF 3   3
                  2019    1   MIN ATL 28  12  <NA>    9   9', header = T)

if_else(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)  
#> Warning in `[<-.factor`(`*tmp*`, i, value = structure(c(5L, 3L), .Label =
#> c("CAR", : invalid factor level, NA generated
#> [1] GB   LA   <NA> BUF  <NA>
#> Levels: ATL BUF GB LA WAS

ifelse(wk1$home_score < wk1$away_score, wk1$away_team, wk1$home_team)
#> [1] 3 4 5 2 3

reprex package (v0.3.0) 于 2019 年 10 月 9 日创建

【讨论】:

    【解决方案2】:

    另一种选择是在 if else 中使用 as.character

    if_else(wk1$home_score

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2022-12-01
      • 2017-06-23
      相关资源
      最近更新 更多