You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 00:21:40