如何用data.table根据列值生成随机整数?适配大数据集提升效率
使用data.table高效生成每行对应上限的随机整数
首先需要指出:你提供的Base R代码dt$random <- sample(1:dt$value, size=nrow(dt), rep = TRUE)无法正确实现需求——因为1:dt$value会将整个value向量的元素作为序列上限循环生成,而非每行生成1到对应行value的随机数。正确的Base R实现通常会用apply,但这种循环方式在大数据集上速度极慢。
以下是data.table的高效实现方案,优先推荐完全向量化的方法:
方法一:向量化生成(最快,适合超大数据集)
利用均匀分布随机数的向量化特性,直接生成每行的随机整数,全程无循环,性能最优:
library(data.table) # 将现有数据框转换为data.table(如果还不是的话) setDT(dt) # 生成随机列:每个值在1到对应行value之间(包含两端) dt[, random := floor(runif(.N, min = 1, max = value + 1))]
原理:runif(.N, 1, value+1)生成[1, value+1)区间的均匀随机数,通过floor取整后,恰好得到1到value之间的整数,统计上和sample(1:x, 1)等价,但速度提升几个数量级。
方法二:使用mapply(兼容sample.int逻辑)
如果需要严格调用sample.int实现抽样(和Base R的sample逻辑完全一致),可以用mapply结合data.table语法,比Base R的apply更快:
dt[, random := mapply(sample.int, n = value, size = 1)]
但这种方式本质还是逐行操作,速度远不如方法一,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者atatam_anukah
相关产品推荐
相关产品推荐

