【问题标题】:Combine if statement with case when in mutate将 if 语句与 mutate 中的 case 结合起来
【发布时间】:2022-12-06 08:50:47
【问题描述】:

我有下表:

df_test <-data.frame(player = c('a', 'b', 'c', 'd', 'e'),
                            position = c('G', 'F', 'F', 'G', 'G'),
                            points = c(9, 15, 19, 22, 32),
                            rebounds = c(5, 7, 7, 12, 11))

假设我想添加名为 rating 的新列。新列的规则如下:

  1. 检查点数是否超过 10。
  2. 然后,执行 case_when 检查其他变量: - 当篮板数 >=7 时,我们将“平均”添加到变量评级中 - 当篮板 >=10 时,我们在变量评级中添加“好” - 否则,NA

    为此,我使用以下代码:

    df_test%>% mutate(new=if(points>=20){
        case_when(rebounds>=7~"good",
                  rebounds>10~"best")
    })
    

    但是,这给了我以下错误:条件的长度 > 1。

    我们如何在同一个 mutate 语句中组合 if 和 case_when,或者是否有可能在 case_when 中编写 case_when?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以在case_when里面添加多个条件

    library(dplyr)
    
    df_test <-data.frame(player = c('a', 'b', 'c', 'd', 'e'),
                         position = c('G', 'F', 'F', 'G', 'G'),
                         points = c(9, 15, 19, 22, 32),
                         rebounds = c(5, 7, 7, 12, 11))
    
    df_test %>% 
      mutate(
        rating = case_when(
          points > 10 & rebounds >= 10 ~ "good",
          points > 10 & rebounds >= 7  ~ "average",
          TRUE ~ NA_character_
        )
      )
    
      player position points rebounds  rating
    1      a        G      9        5    <NA>
    2      b        F     15        7 average
    3      c        F     19        7 average
    4      d        G     22       12    good
    5      e        G     32       11    good
    

    是的,您还可以添加另一个case_when

    df_test %>% 
      mutate(
        rating = case_when(
          points > 10 ~ case_when(
            rebounds >= 10 ~ "good",
            rebounds >= 7  ~ "average"
          ),
          TRUE ~ NA_character_
        )
      )
    

    【讨论】:

    • 我知道这行得通,但是这个问题专门询问了一种将 if 与 case when 结合起来的方法,或者使用两种 case when 的方法。我需要在另一个更大的数据集中提到这里的逻辑。这里的数据集只是为了说明。在我的原始数据集中,已经有很多条件,所以我想让它像一棵树一样,开头有一个 if 语句,而不是在以下情况下多次重复相同的条件
    • 如果您只是将 points &lt;= 10 ~ NA_character_, 添加为第一个 case_when() 条件会怎么样?如果它是顺序的,那么第一个正确的语句将转到NA,其他条件只会在之后起作用。不需要像这样嵌套语句 - 在 dplyr 大量借用此功能的 SQL 世界中确实如此。
    • 我添加了另一个选项,有 2 case_when's
    猜你喜欢
    • 2021-09-21
    • 2020-08-03
    • 2015-05-18
    • 1970-01-01
    • 2021-09-18
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多