使用Dplyr Mutate和If_Else将多列条件重新编码为一个新列

3
使用下面这个简单的数据框,我想创建一个新列,其中包含City =“Toronto”和PostInjury =“0-1”的实例为1,City =“Montreal”和PostInjury =“6-10”的实例为2,其他情况为3。
我想使用mutate和if_else,但不确定如何使用此组合将多个列组合有条件地重新编码为一个新列,而不需要中间步骤?我可以使用两个if_else语句创建两个新列,然后使用Tidyr的unite将它们组合起来,然后进行重新编码,但那似乎非常繁琐。
我是不是漏掉了什么优雅的方法?我有一种感觉。有没有办法在dplyr中以这种方式使用if_else,或者也许是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)
1个回答

3
你可以使用嵌套的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”,还是我忽略了其他原因?目前看起来似乎没有区别。 - Mike
在这种情况下,这主要是一个品味问题。我不确定它们在性能方面如何比较。 - Weihuang Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接