如何基于data.frame的study列值为每个分组随机抽取不等数量的行
实现方案
你可以通过dplyr的分组抽样功能实现需求,先构造全量的expand.grid结果,再按study分组随机抽取不等行数即可,可运行代码如下:
library(dplyr) # 构造全量基准数据,这里修正示例代码的笔误,将study设为1:3匹配后续的3个分组 full_data <- expand.grid(study = 1:3, outcome = rep(1:2, 2)) |> arrange(study, outcome) # 按study分组随机抽样,每个分组抽样行数在1~该组总行数之间完全随机 set.seed(123) # 固定随机种子方便复现结果,不需要可直接删除 result <- full_data |> group_by(study) |> slice_sample(n = sample(1:n(), size = 1)) |> # 每个组随机生成1到组内总数量的抽样行数 ungroup() # 查看输出结果 result
固定上述种子的示例输出如下(更换随机种子/删除种子后结果会随机变化):
# A tibble: 7 × 2 study outcome <int> <int> 1 1 1 2 1 2 3 1 1 4 2 2 5 2 1 6 3 1 7 3 2示例结果中study1抽3行、study2抽2行、study3抽2行,符合每个分组行数完全随机的要求。如果需要自定义抽样行数的上下限,只需修改
sample(1:n(), size = 1)的区间参数即可,比如要求每个组最少抽2行、最多抽4行,改为sample(2:min(4, n()), size = 1)即可。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

