【问题标题】:Conditionally Recoding Mutiple Columns into One New Column with Dplyr Mutate and If_Else使用 Dplyr Mutate 和 If_Else 有条件地将多个列重新编码为一个新列
【发布时间】:2016-10-26 05:15:58
【问题描述】:

使用下面的简单数据框,我要创建一个新列,其中包含 1 用于 City = "Toronto" 和 PostInjury = "0-1" 的实例,一个 2 用于 City = "Montreal" 和 PostInjury = 的实例6-10",其他都是 3。

我想使用 mutate 和 if_else,但不确定如何使用这种组合将多个列组合有条件地重新编码为一个新列而无需中间步骤?我可以使用两个 if_else 语句来创建两个新列,然后将它们与 Tidyr 的联合合并,然后重新编码,但这似乎很乏味。

我错过了什么优雅的东西吗?我有一种感觉。有没有办法以这种方式将 if_else 与 dplyr 或 case_when 一起使用?

 City<-c("Toronto", "Toronto", "Montreal","Ottawa","Montreal",
    "Hamilton","Peterborough","Toronto","Hamilton","Montreal")

 Client<-c("Cl1","Cl2","Cl3","Cl4","Cl5","Cl6","Cl7","Cl8","Cl9","Cl10")

 PostInjury<-c("0-1","6-10","0-1","2-5","6-10","0-1","11-15","0-1","0-1","6-10")

DF<- data.frame(City,Client,PostInjury)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以使用嵌套的ifelse。与dplyr

    DF <- DF %>% 
      mutate(new_column = if_else(City == "Toronto" & PostInjury == "0-1", 1,
        if_else(City == "Montreal" & PostInjury == "6-10", 2, 3)))
    

    使用case_when

    DF <- DF %>% mutate(new_column = 
      case_when(
          City == "Toronto" & PostInjury == "0-1" ~ 1,
          City == "Montreal" & PostInjury == "6-10" ~ 2, 
          TRUE ~ 3
      )
    )
    

    或使用base 函数:

    DF$new_column <- ifelse(DF$City == "Toronto" & DF$PostInjury == "0-1", 1,
      ifelse(DF$City == "Montreal" & DF$PostInjury == "6-10", 2, 3))
    

    或者

    DF$new_column <- sapply(as.character(interaction(DF$City, DF$PostInjury)),
      switch, 
      "Toronto.0-1" = 1,
      "Montreal.6-10" = 2,
      3)
    

    【讨论】:

    • 感谢您的回答。只是一个简单的问题,我是“case_when”函数的新手。在“if_else”上使用它的主要原因是为了避免嵌套的“if_else”,还是我忽略了 case_when 的另一个原因?在这一点上似乎是一样的。
    • 在这种情况下,主要是口味问题。我不确定他们如何比较性能。
    猜你喜欢
    • 2018-05-11
    • 2018-04-07
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多