基于双ID变量标记重复关联的data.table解决方案需求
R data.table 重复关联标记实现方案
实现方案
a) 大数据量高效实现方案
采用全向量化操作,避免逐行遍历,适合十万级以上数据集使用,性能提升明显:
library(data.table) # 构造示例数据 dt <- data.table(id1=c(1,1,2,3,3,3,4), id2=c(1,2,2,1,2,3,2)) # 核心逻辑 dt[, `:=`(first_id1 = !duplicated(id1), first_id2 = !duplicated(id2))] valid_pairs <- dt[first_id1 & first_id2, .(id1, id2)] dt[valid_pairs, valid := 1, on = .(id1, id2)] dt[, flag := fifelse(is.na(valid), "Y", "")] # 清理中间字段得到最终结果 dt[, `:=`(first_id1 = NULL, first_id2 = NULL, valid = NULL)]
b) 仅使用基础函数与data.table内置函数实现方案
逻辑直观易理解,适合中小数据集使用:
library(data.table) # 构造示例数据 dt <- data.table(id1=c(1,1,2,3,3,3,4), id2=c(1,2,2,1,2,3,2)) # 核心逻辑 used_id1 <- c() used_id2 <- c() dt[, flag := { if (.BY[[1]] %in% used_id1 || .BY[[2]] %in% used_id2) { "Y" } else { used_id1 <<- c(used_id1, .BY[[1]]) used_id2 <<- c(used_id2, .BY[[2]]) "" } }, by = 1:nrow(dt)]
输出结果验证
两种方案运行后得到的结果均符合预期:
| id1 | id2 | flag | 说明 |
|---|---|---|---|
| 1 | 1 | ||
| 1 | 2 | Y | 因为第一行中id2=1已与id1=1关联 |
| 2 | 2 | ||
| 3 | 1 | Y | 因为第一行中id2=1已与id1=1关联 |
| 3 | 2 | Y | 因为第三行中id2=2已与id1=2关联 |
| 3 | 3 | ||
| 4 | 2 | Y | 因为第三行中id2=2已与id1=2关联 |
内容的提问来源于stack exchange,提问作者R007
相关产品推荐
相关产品推荐

