按指定样本量从分组DataFrame中进行简单随机抽样的实现方法
当然可以!完全不用重复编写抽样代码就能实现按组指定不同样本量的需求,这里有两种简洁的方法供你参考:
方法1:用命名向量匹配分组样本量
先把你的样本量向量nj转换成命名向量,让每个名字对应strat的分组值,这样就能在分组后自动匹配对应组的抽样数量:
library(dplyr) # 将nj转换为命名向量,名字对应strat的分组值 nj_named <- setNames(nj, c(1, 2, 3)) # 分组后按对应样本量抽样 new_df <- my.df %>% group_by(strat) %>% # 用cur_group()获取当前分组的strat值,匹配对应的样本量 slice_sample(n = nj_named[as.character(cur_group()$strat)]) %>% ungroup()
注:dplyr 1.0.0及以上版本推荐使用slice_sample()替代sample_n(),功能更一致。如果用旧版本,把slice_sample(n = ...)换成sample_n(size = ...)即可。
方法2:合并样本量数据框后抽样
如果觉得命名向量不够直观,可以先创建一个包含分组和对应样本量的小数据框,和原数据合并后再分组抽样:
library(dplyr) # 创建包含分组和对应样本量的小数据框 sample_sizes <- tibble(strat = c(1, 2, 3), n = nj) # 合并后按组抽样 new_df <- my.df %>% left_join(sample_sizes, by = "strat") %>% group_by(strat) %>% # 每个组的n值都相同,取第一个即可 slice_sample(n = first(n)) %>% select(-n) %>% # 移除临时添加的样本量列 ungroup()
额外提示
如果某个分组的现有观测数小于你指定的样本量,dplyr会默认返回该组所有观测并发出警告。如果需要强制抽取指定数量(允许重复抽样),可以在slice_sample()里加上replace = TRUE参数。
内容的提问来源于stack exchange,提问作者user14703201
相关产品推荐
相关产品推荐

