如何使用data.table按组按比例抽样?含无放回与有放回场景
在data.table中按组抽取固定比例样本(无放回/有放回)
无放回抽取每组50%样本
直接利用data.table的分组特性,结合sample()函数选取每组的行索引即可:
library(data.table) # 构造示例数据 dt <- data.table( group = rep(letters[1:3], each = 10), value = rnorm(30) ) # 无放回抽取每组50%样本 dt_sample_without <- dt[, .SD[sample(.N, round(.N * 0.5))], by = group]
.N表示当前组的行数sample(.N, round(.N * 0.5))从组内随机选取50%数量的行号(默认无放回).SD[行号]提取对应行组成子表
如果是超大数据集,推荐用更高效的索引写法,避免处理.SD:
dt_sample_without <- dt[dt[, .I[sample(.N, round(.N*0.5))], by = group]$V1]
.I是整个数据表的全局行索引,分组后筛选出目标索引再直接提取,性能更优。
有放回抽取每组50%样本
只需要在sample()中添加replace = TRUE参数即可开启有放回抽样:
# 有放回抽取每组50%样本 dt_sample_with <- dt[, .SD[sample(.N, round(.N * 0.5), replace = TRUE)], by = group]
同样可以用高效索引写法:
dt_sample_with <- dt[dt[, .I[sample(.N, round(.N*0.5), replace = TRUE)], by = group]$V1]
和dplyr的sample_frac(0.5, replace = TRUE/FALSE)逻辑一致,但data.table的分组操作在大数据场景下性能优势更明显。
内容的提问来源于stack exchange,提问作者Union find
相关产品推荐
相关产品推荐

