首页 > 解决方案 > 使用 mutate 和 case_when 在 dplyr 中通过双重条件重新编码变量

问题描述

当现场工作人员观察在哪些地点 (Siteid) 种植了哪些树种 (SORTNR) 时,我正在尝试纠正在现场所犯的错误。不幸的是,不同站点所犯的错误并不相同。

我想在我的代码中表达的是:当 Siteid 和 SORTNR 是特定组合时,将 SORTNR 替换为正确的值。但是,当我随后检查数据时,所有 SORTNR 都是 NA。

如果我将其分解并仅运行一个重新编码块,看起来好像调用中未包含的组合的变量 SORTNR 设置为 NA,并且运行这两个块将导致所有组合设置为 NA。

如何防止未提及的组合更改为 NA?我们是否可以不必明确声明我想用它们自己替换正确的值?

样本数据:

Siteid <- c(rep("F410", 10), "F411","F411","F411","F411","F411")
SORTNR <- c(1,2,4,5,8,9,10,11,12,2,12,14,28,15,12)
Dataframe <- data.frame(cbind(Siteid,SORTNR))

重新编码

#Recoding Block 1
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
  Siteid=="F410" & SORTNR==1~2,
  Siteid=="F410" & SORTNR==2~2,
  Siteid=="F410" & SORTNR==4~28,
  Siteid=="F410" & SORTNR==5~28,
  Siteid=="F410" & SORTNR==8~28,
  Siteid=="F410" & SORTNR==9~28,
  Siteid=="F410" & SORTNR==10~27,
  Siteid=="F410" & SORTNR==11~28,
  Siteid=="F410" & SORTNR==12~28))

#Recoding Block 2
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
 Siteid=="F411" & SORTNR==12~13,
 Siteid=="F411" & SORTNR==28~29,
 Siteid=="F411" & SORTNR==14~14,
 Siteid=="F411" & SORTNR==15~15

标签: rdplyrconditional-statementsrecode

解决方案


case_when()分配了在语句中不匹配的值,NA因此您需要将其TRUE ~ SORTNR用作最终条件以避免这种情况。

library(dplyr)

Dataframe %>%
  mutate(SORTNR = case_when(Siteid=="F410" & SORTNR %in% c(1,2) ~ 2,
                            Siteid=="F410" & SORTNR %in% c(4,5,8,9,11,12) ~ 28,
                            Siteid=="F410" & SORTNR == 10 ~ 27,
                            Siteid=="F411" & SORTNR == 12 ~ 13,
                            Siteid=="F411" & SORTNR == 28 ~ 29,
                            Siteid=="F411" & SORTNR == 14 ~ 14,
                            Siteid=="F411" & SORTNR == 15 ~ 15,
                            TRUE ~ SORTNR))

推荐阅读