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

R语言数据框分层随机抽样:等比例及差异化比例抽样实现

R dplyr分组按比例抽样实现方法

你之前用到的sample_n()是固定数量抽样函数,dplyr配套提供了sample_frac()按比例抽样函数,参数逻辑和sample_n()完全一致,也可以通过计算每组抽样量适配sample_n()的写法,两类需求的实现代码如下:


需求A:所有类别统一抽取0.05%的样本

方法1:使用sample_frac()(更简便)

library(dplyr)
pop %>%
  group_by(category) %>%
  sample_frac(size = 0.0005) # 0.05%换算为小数为0.0005

方法2:适配sample_n()写法

如果需要保留sample_n()的调用逻辑,可以先计算每组对应抽样量,用ceiling()向上取整避免小样本分组抽不到结果:

pop %>%
  group_by(category) %>%
  sample_n(size = ceiling(n() * 0.0005))

需求B:不同类别设置独立抽样比例

首先定义分组抽样比例映射表,再关联原数据实现差异化抽样:

# 定义抽样规则:a抽0.05%、b抽0.1%、c抽20%
sample_rule <- data.frame(
  category = c("a", "b", "c"),
  frac = c(0.0005, 0.001, 0.2)
)

方法1:使用sample_frac()实现

pop %>%
  left_join(sample_rule, by = "category") %>%
  group_by(category) %>%
  sample_frac(size = first(frac)) %>%
  select(-frac) # 移除多余的比例字段

方法2:适配sample_n()写法

pop %>%
  left_join(sample_rule, by = "category") %>%
  group_by(category) %>%
  sample_n(size = ceiling(n() * first(frac))) %>%
  select(-frac)

注意:你提供的示例数据各组样本量极小(a组仅15条、b组30条、c组50条),0.05%的比例计算后抽样数不足1,测试时可临时放大比例(如改为20%即0.2)即可看到返回的抽样结果。

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:39:04