R语言使用dplyr多条件交叉校验两个数据框的方法
错误原因
- 原代码判断逻辑顺序错误:将左连接后
sp_l为空(即申报id在许可证表无任何记录)的场景直接判定为not_needed,没有优先区分申报物种是否属于需要持证的三类物种,导致申报需许可物种BFT的id N被错判。 - 原逻辑没有先划定需许可物种范围,把「无许可证记录」和「申报物种无需许可」两个完全不同的场景做了混淆。
修正方案
调整case_when的判断优先级,先区分申报物种是否需要许可证,再对需许可的物种校验许可匹配性,修正后代码如下:
license = c("BFT","ALB","SWO") library(tidyverse) # 构造申报数据集 id =c("A","B","C","D","E","F","M","N") sp = c("SWO","BFT","HKE","MUR","OCC","ALB","ANN","BFT") data1 = tibble(id,sp) # 构造许可证数据集 id = c("A","B","Z","F","S","T") sp_l = c("SWO","BFT","BFT","SWO","ALB","SWO") data2 = tibble(id,sp_l) # 执行校验 left_join(data1, data2, by = "id") %>% mutate(Check = case_when( # 申报物种不在需许可列表内,直接标记not_needed !sp %in% license ~ "not_needed", # 需许可物种且许可匹配,标记ok sp == sp_l ~ "ok", # 剩余场景均为需许可但无有效对应许可,标记danger TRUE ~ "danger" )) %>% select(id, sp, Check)
运行结果
# A tibble: 8 × 3 id sp Check <chr> <chr> <chr> 1 A SWO ok 2 B BFT ok 3 C HKE not_needed 4 D MUR not_needed 5 E OCC not_needed 6 F ALB danger 7 M ANN not_needed 8 N BFT danger
结果符合校验规则:id N申报需许可的BFT但无对应许可记录,被正确标记为danger;其余记录判定均符合预期。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

