如何用R的dplyr按id分组检查两个数据框列值的一致性
使用dplyr检查数据框A的var值是否存在于对应id的B数据框var2中
问题需求
现有两个R数据框A和B:
- 数据框A包含
id与对应的var列 - 数据框B记录各
id的注册产品var2列
需要用dplyr包,按id分组检查A中每个id的var值是否存在于B对应id的var2值中,新增CHECK列返回TRUE或FALSE,生成指定结构的结果数据框。
数据定义
library(dplyr) id = c("A","B","C","D","E","Z") var = c("phone","car","bike","chair","mouse",NA);var A = tibble(id,var);A id = c(rep("A",2),"B",rep("C",2),rep("D",3),rep("E",3),"Z","H") var2 = c("phone","car",NA,"bike","phone","chair","phone","car","chair","phone","car","car","bike") B = tibble(id,var2);B
解决方案
先整理B数据框,按id聚合出每个id对应的有效var2集合,再与A左连接后完成判断,同时处理各类NA边界场景:
# 整理B:按id分组,提取每个id的非NA var2值列表 B_grouped <- B %>% group_by(id) %>% summarise(var2_values = list(na.omit(var2)), .groups = "drop") # 连接A与整理后的B,生成CHECK列 result_df <- A %>% left_join(B_grouped, by = "id") %>% mutate( CHECK = case_when( is.na(var) ~ FALSE, # A中var为NA时返回FALSE is.na(var2_values) ~ FALSE, # B中无对应id的有效var2时返回FALSE length(unlist(var2_values)) == 0 ~ FALSE, # B中对应id的var2全为NA时返回FALSE TRUE ~ var %in% unlist(var2_values) # 正常判断var是否在对应id的var2列表中 ) ) %>% select(id, var, CHECK) # 保留目标列 # 查看结果 result_df
结果说明
运行代码后得到的result_df完全符合需求:
- 每个id的
CHECK列准确返回其var值是否存在于B对应id的非NAvar2值中 - 覆盖了所有边界场景:A的
var为NA、B无对应id、B对应id的var2全为NA等,这些场景下CHECK均返回FALSE
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

