当前位置: 首页 > 知识库问答 >
问题:

用Dplyr突变和If_Else将多列有条件地编码为一个新列

蓟安歌
2023-03-14
 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个答案

益何平
2023-03-14

您可以使用嵌套的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)
 类似资料:
  • 使用下面的示例代码,我想使用“mutate”或“mutate_at”将多个列重新编码为基于另一列的值的新列。基本上,我想基于相应的非“S”变量的值,重新编码以“S”结尾的变量(q25s,q26s等..)。例如,如果q25=1,那么q25s将被重新编码,使得1=0,2=0,3=0,4=1,5=1和88=缺失,并且新名称将是q25_new。如果q25不等于1,则不应重新编码is,而q25_new应仅为

  • 我正在为一个大的数据集创建条件平均值,这个数据集包含了几年来一周内看到的流感病例数。数据是这样组织的: 我想做的是创建一个新的列,列出往年同一周的平均病例数。例如,对于Week所在的行。数字是1和流感。今年是2017年,我希望新行给出任何一年的平均计数。数字==1 但是,由于有四年的数据* 52周,因此需要大量迭代才能阐明条件。有没有办法在dplyr中优雅地编码它?我经常遇到的问题是,我想根据周.

  • 我试图在一个数据集中的多个主题上求和多个变量。我知道如何使用plyr包来实现这一点;然而,由于数据集的长度,变量的数量,以及我试图做的不同滚动和的数量(2天,3天,4天等)。我想知道是否有人有更多的时间,更有效的方式来完成这项任务在DPLYR。 我的数据与此类似: 谢谢你。

  • 我有一个带有两个得分列的data.frame。我希望在每行的基础上有条件地使用其中一个的数据。我用下面的一个例子来解释... 在这种情况下,Final最终将与test_low相同,因为对于两个Mains(即,当单元格为'high'时,单元格为'low时),test_low列小于test_high列。

  • 我试图计算许多列的行平均值。有人能解释一下为什么下面的代码只计算代码中两个变量(var_1和var_13)的平均值,而不是所有13列的平均值吗?

  • 我已经更新了dplyr(现在是0.7.1),我的很多旧代码都不能用了,因为mutate_each已经被弃用了。我曾经用mutate_each做类似这样的事情(代码如下),使用列索引。我会在数百个专栏中这样做。而我就是搞不清楚如何用mutate_at正确使用vars参数。我看到的所有例子都使用了列名...我不想这么做。我确信这是一个简单的答案,但是我已经花了太多的时间试图弄明白它,并且将非常感谢一些