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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:45:02