R语言data.table匹配同因子组合行 提取另一表随机行索引求解
可行方案(全向量化,无需逐行处理)
核心逻辑
利用data.table的分组和连接能力,先对dt2按因子组合分组抽取随机行号,再匹配到dt1中,全程为原生向量化操作,性能远高于逐行循环,适合大数据量场景。
完整可运行代码
1. 构造示例数据(已适配你的场景)
library(data.table) # dt1示例 dt1 <- data.table( ID = c("01", "02", "03"), Factor1 = c("A", "B", "C"), Factor2 = c("X", "X", "Y"), Factor3 = c("J", "L", "J") ) # dt2示例 dt2 <- data.table( Factor1 = c("A", "A", "A", "B", "B", "C", "C"), Factor2 = c("Z", "X", "X", "J", "X", "X", "Y"), Factor3 = c("K", "J", "J", "L", "L", "J", "J") )
2. 核心处理代码
# 定义公共因子列,可根据你的实际列名调整 factor_cols <- c("Factor1", "Factor2", "Factor3") # 若不想修改原dt2,先复制一份再加行号 dt2_temp <- copy(dt2)[, orig_idx := .I] # dt2按因子组合分组,每组随机抽取1个原始行号 dt2_sample <- dt2_temp[, .(Index = sample(orig_idx, 1)), by = factor_cols] # 匹配结果到dt1 dt1[dt2_sample, Index := Index, on = factor_cols]
输出效果
运行后dt1会直接追加Index列,和你要求的示例完全一致:
ID Factor1 Factor2 Factor3 Index 1: 01 A X J 2 2: 02 B X L 5 3: 03 C Y J 7
注:每次运行sample会返回不同的随机索引,符合随机抽取要求
内容的提问来源于stack exchange,提问作者rw2
相关产品推荐
相关产品推荐

