使用 mutate 和 case_when 在 dplyr 中通过双条件重新编码变量

Recoding a variable by a double conditional in dplyr using mutate and case_when

我正在尝试纠正现场工作人员观察在哪些地点 (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

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))