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
相关产品推荐
相关产品推荐

