如何按关键字并按比例合并或填充两个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
相关产品推荐
相关产品推荐

