如何在R的data.table中基于分布实现数据集间的值映射
解决方案
你可以利用data.table结合sample()函数,基于small_data中的百分比(或计数)作为权重,给big_data的每个ID分配对应日期,实现近似比例的映射:
set.seed(123) # 保持结果可复现 # 基于small_data的日期和对应的百分比权重,为big_data分配日期 big_data[, date := sample(small_data$date, size = .N, replace = TRUE, prob = small_data$perc)] # 查看分配后的结果(前6行) head(big_data) # 验证分配比例是否符合预期 big_data[, .(count = .N, perc = 100*.N/nrow(big_data)), by = date][order(-perc)]
代码说明
sample()函数的prob参数传入small_data$perc,让采样概率和原数据的百分比对应,实现近似比例分配.N在data.table中代表当前分组的行数,这里直接匹配big_data的总行数完成采样- 最后验证步骤可以查看每个日期的实际分配比例,确认和原数据的
perc近似匹配
示例验证结果
运行上述代码后,你会得到类似这样的分配比例(因随机采样会有微小差异):
date count perc 1: 2019-10-01 9 9.000000 2: 2016-10-01 8 8.000000 3: 2017-07-01 8 8.000000 4: 2016-01-01 7 7.000000 5: 2017-10-01 7 7.000000 6: 2018-10-01 7 7.000000 7: 2019-07-01 6 6.000000 8: 2016-10-01 6 6.000000 9: 2019-04-01 4 4.000000 10: 2017-01-01 4 4.000000 11: 2018-01-01 4 4.000000 12: 2017-10-01 3 3.000000 13: 2016-07-01 3 3.000000 14: 2018-01-01 2 2.000000 15: 2019-01-01 2 2.000000 16: 2017-04-01 2 2.000000 17: 2019-01-01 2 2.000000
可以看到各日期的分配比例和原small_data中的perc基本近似,满足需求。
内容的提问来源于stack exchange,提问作者Inkling
相关产品推荐
相关产品推荐

