【问题标题】:How to write ifelse statement with multiple conditions in R?如何在R中编写具有多个条件的ifelse语句?
【发布时间】:2018-11-21 08:26:01
【问题描述】:

我写ifelse语句有问题,我有三列如下图:

Team 1     Winner
  T1        T1
  T2        T1
  T2        NA
  T3        NA

我想要另一列:结果,如果 Team=Winner,它应该是 Winner,否则失败,如果 Team=anything & Winner=NA,那么它应该没有结果...

Team 1     Winner   result
  T1        T1       winner
  T2        T1       losser
  T2        NA       noresult
  T3        NA       noresult

任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    另一种可能性是case_when 来自dplyr

    library(dplyr)
    
    df %>% 
      mutate(Result = case_when(
        Team == Winner ~ "Winner",
        Team != Winner ~ "Loser",
        is.na(Winner) ~ "No result"
      ))
    
    
    #   Team Winner    Result
    # 1   T1     T1    Winner
    # 2   T2     T1     Loser
    # 3   T2   <NA> No result
    # 4   T3   <NA> No result
    

    数据:

    tt <- "Team     Winner
      T1        T1
    T2        T1
    T2        NA
    T3        NA"
    
    df <- read.table(text=tt, header = T, stringsAsFactors = F)
    

    【讨论】:

      【解决方案2】:

      你可以使用dplyr::if_else(),就像我learned一样,它很严格,因为它检查数据类型并处理NA,使代码更简单:

       df %>% mutate(Result = if_else( Team==Winner, "Winner", "Loser", missing ='No result'))
        Team Winner    Result
      1   T1     T1    Winner
      2   T2     T1     Loser
      3   T2   <NA> No result
      4   T3   <NA> No result
      

      尽管在这里查看单线解决方案,但对于您的示例数据,它并不是最快的(获胜者是@Tim Biegeleisen 的答案,+1):

      Unit: microseconds
          expr      min        lq       mean    median        uq      max neval cld
       IF_ELSE  893.013  974.5060 1176.35331 1053.2260 1343.3590 2278.398   100  b 
        IFELSE   20.481   34.3475   49.57934   47.3605   58.0275  143.361   100 a  
          CASE 1067.946 1152.4255 1423.41426 1226.0255 1721.3850 4108.795   100   c
      

      所以我可以在简单性(当然是主观的)和更多的控制(即客观,由于函数的性质)和速度(如果这对你有问题,看看你的真实情况)之间进行权衡数据,但更客观)。

      【讨论】:

        【解决方案3】:

        使用 -

        df$Winner <- factor(df[,2], levels=unique(df$Team.1)) # avoid "level sets of factors are different" error
        df$result <- ifelse(df$Team.1 == df$Winner, "winner", "loser")
        df[is.na(df$result), "result"] <- "noresult"
        df
        

        输出

          Team.1 Winner   result
        1     T1     T1   winner
        2     T2     T1    loser
        3     T2   <NA> noresult
        4     T3   <NA> noresult
        

        【讨论】:

          【解决方案4】:

          试试这个逻辑:

          df$result <- ifelse(is.na(df$Winner), "no result",
              ifelse(df$Team==df$Winner, "winner", "loser"))
          df
          
          Team Winner    result
          1   T1     T1    winner
          2   T2     T1     loser
          3   T2   <NA> no result
          4   T3   <NA> no result
          

          【讨论】:

          • 这是给 NA 我希望它成为失败者的地方
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 2019-05-06
          • 1970-01-01
          相关资源
          最近更新 更多