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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:24:30