如何基于lookup列无重复匹配两个dataframe,未匹配结果返回NA
R 实现两DataFrame按lookup列匹配且ID不重复使用的解决方案
核心实现逻辑:对两个表的同lookup值分别编组内序号,通过lookup+组内序号双字段匹配,天然保证ID不会被重复调用,同lookup下ID用完后后续匹配自动返回NA,全程为向量化操作,即使DF2有2万+行也能高效运行。
步骤1:模拟示例数据(实际使用时替换为你自己的数据集即可)
# 加载依赖包,没有安装可先运行 install.packages("dplyr") library(dplyr) # 示例DF1 DF1 <- data.frame( lookup = c("EM1PRI", "EM1PRI", "EM2PRI", "EM3PRI", "EM3PRI") ) # 示例DF2 DF2 <- data.frame( lookup = c("EM1PRI", "EM1PRI", "EM2PRI", "EM3PRI", "EM4PRI"), ID = c("ID001", "ID002", "ID003", "ID004", "ID005") )
步骤2:可选预处理(DF2去重)
如果DF2存在同lookup下重复ID的情况,可先去重避免无效占用ID配额:
DF2 <- DF2 %>% distinct(lookup, ID, .keep_all = TRUE)
步骤3:分别为两表添加组内序号
# 为DF1的同lookup行按顺序编序号 DF1_with_idx <- DF1 %>% group_by(lookup) %>% mutate(idx = row_number()) %>% ungroup() # 为DF2的同lookup下的ID按顺序编序号 DF2_with_idx <- DF2 %>% group_by(lookup) %>% mutate(idx = row_number()) %>% ungroup()
步骤4:匹配生成结果表DF3
DF3 <- DF1_with_idx %>% left_join(DF2_with_idx, by = c("lookup", "idx")) %>% select(-idx)
运行后得到的DF3结果如下,完全符合预期:
| lookup | ID |
|---|---|
| EM1PRI | ID001 |
| EM1PRI | ID002 |
| EM2PRI | ID003 |
| EM3PRI | ID004 |
| EM3PRI | NA |
Base R 实现版本(不需要加载第三方包)
# 为DF1加组内序号 DF1$idx <- ave(rep(1, nrow(DF1)), DF1$lookup, FUN = seq_along) # 为DF2加组内序号 DF2$idx <- ave(rep(1, nrow(DF2)), DF2$lookup, FUN = seq_along) # 左连接匹配 DF3 <- merge(DF1, DF2, by = c("lookup", "idx"), all.x = TRUE) # 删除临时序号列 DF3$idx <- NULL
内容的提问来源于stack exchange,提问作者KatChristiansen
相关产品推荐
相关产品推荐

