r - 使用 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
解决方案
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))
推荐阅读
- java - 使用 elasticsearchOperations 搜索时出现 Elastic ConverterNotFoundException
- in-app-purchase - 在添加应用购买之前,我必须对我的应用进行 alpha 测试吗
- google-cloud-platform - 从云功能访问谷歌云存储(无需下载)
- php - 基于mysql php中另一个字段的值的自动填充下拉菜单
- javascript - 浏览器后退按钮自定义验证有时无法使用 jquery
- html - HTML/CSS - 如何避免图像拉伸
- linux - 如何不将文件的更改从一个分支转移到 git 中的另一个
- python - 有没有一种通用的方法来使用 try/except 作为布尔值来创建条件?
- nagios - 需要帮助了解 Nagios check_interval retry_interval max_check_attempts notification_interval notification_options
- assembly - x86 timer2 of 8254/8253:总是创建 1s 而不是 wave