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

如何按关键字并按比例合并或填充两个data.table数据

按关键字(TYPE)和比例填充data.table的DATE字段

我来帮你搞定这个按TYPE关键字、按比例给表A填充DATE的需求,用data.table的高效语法就能轻松实现,咱们一步步来:

步骤1:先把你的数据转换成可操作的data.table对象

先把你给出的两个表模拟成data.table,方便后续操作:

library(data.table)

# 表A(还原你给出的结构)
tableA <- data.table(
  ID = c(36111468,93908095,68889156,94391053,66486300,48316003,30945034,93530960,50298782,61124841,73185741,61584842,65174431,69089847,31180801,41084849),
  DATE = rep(0,16),
  TYPE = c(rep("A",2), rep("B",2), rep("C",4), rep("D",6), rep("E",2))
)

# 表B(补充你给出的部分数据)
tableB <- data.table(
  ID = c(30341961,53682621,43370733,61728911,79482564,81995262,23256429),
  DATE = c(20031124,20041023,20040119,20040909,20020107,20040609,20021029),
  TYPE = c("A","B","C","C","D","D","D")
)

步骤2:计算每个TYPE的分配比例

我们需要先统计每个TYPE在两张表中的记录数,确定表B的每条DATE需要分配给表A的多少条记录:

# 统计各TYPE的记录数
countA <- tableA[, .N, by = TYPE]  # 表A中每个TYPE的行数
countB <- tableB[, .N, by = TYPE]  # 表B中每个TYPE的行数

# 合并数量表,计算分配逻辑:直接按表A的总条数生成对应长度的DATE序列
ratio_table <- merge(countA, countB, by = "TYPE", suffixes = c("_A", "_B"))

步骤3:按比例扩展表B的DATE数据

根据表A每个TYPE的记录数,把表B的DATE扩展到对应长度,确保能覆盖表A的所有记录:

# 精准扩展:每个TYPE下生成刚好等于表A行数的DATE序列
expanded_B <- ratio_table[tableB, on = "TYPE"][, .(DATE = rep(DATE, length.out = N_A)), by = TYPE]

如果想要随机分配而不是顺序重复,只需要在rep前给DATE随机排序:

expanded_B <- ratio_table[tableB, on = "TYPE"][, .(DATE = rep(sample(DATE), length.out = N_A)), by = TYPE]

步骤4:给表A填充DATE字段

最后按TYPE分组,把扩展后的DATE对应分配给表A的每条记录:

# 给表A按TYPE添加行号,方便匹配
tableA[, row_idx := .I, by = TYPE]
# 给扩展后的表B也添加对应行号
expanded_B[, row_idx := .I, by = TYPE]

# 合并填充,得到最终结果
final_result <- merge(tableA, expanded_B, by = c("TYPE", "row_idx"), all.x = TRUE)[, row_idx := NULL]

小提示

  • 如果表A的TYPE在表B中没有对应值(比如你的表A里有TYPE E,但表B没有),最终结果里的DATE会保持0,你可以根据需求添加额外的填充逻辑。
  • 要是你需要的是按比例抽样合并(比如从表B中按比例抽取DATE匹配表A),可以把rep换成sample的重复抽样逻辑。

内容的提问来源于stack exchange,提问作者zell kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:01:10