R语言按因子水平自定义样本量随机抽样及重复存储方法
按多水平因子分层不等量重复抽样实现方案
你原有代码仅支持每个因子水平抽取固定数量样本,要实现不同水平抽指定数量、重复n次抽样并独立存储结果,按以下步骤操作即可:
1. 配置各水平抽样规则
首先用命名向量定义每个因子水平对应的需要抽取的样本量,向量名称必须和数据集中因子的水平名完全一致:
# 按实际需求修改各水平对应的抽样数 sample_size <- c( "A" = 7, "B" = 5, "C" = 8 # 其余因子水平按相同格式追加即可 ) # 前置校验:避免抽样数超过对应水平的实际观测数导致报错 level_obs_count <- table(df$Area) invalid_config <- sample_size[names(level_obs_count)] > level_obs_count if (any(invalid_config)) { stop("以下水平设定的抽样数大于实际观测总数,请调整sample_size配置:", paste(names(which(invalid_config)), collapse = "、")) }
2. 封装单次抽样逻辑
改造你原有的ddply代码,让分组抽样时自动读取对应水平的预设抽样数,不再固定抽3条:
library(plyr) one_time_sample <- function(raw_df, group_col = "Area", size_set) { ddply(raw_df, as.formula(paste0("~", group_col)), function(sub_df) { # 匹配当前分组对应的抽样数量 current_level <- as.character(unique(sub_df[[group_col]])) take_num <- size_set[current_level] sub_df[sample(nrow(sub_df), take_num), ] }) }
如果习惯用dplyr语法,可替换为以下单次抽样实现,逻辑完全一致:
library(dplyr) one_time_sample <- function(raw_df, group_col = "Area", size_set) { raw_df %>% group_by(.data[[group_col]]) %>% slice_sample(n = size_set[as.character(unique(.data[[group_col]]))]) %>% ungroup() }
3. 执行n次重复抽样
设置需要重复的次数n,抽样结果会先存储在列表中,也可以直接生成独立命名的数据框方便后续调用:
# 设置重复抽样次数,比如重复10次就设为10 repeat_n <- 10 # 所有抽样结果存入列表,每个列表元素对应一次抽样得到的数据框 all_sample_result <- lapply(1:repeat_n, function(i) { one_time_sample(raw_df = df, size_set = sample_size) }) # 可选:将每次抽样结果单独赋值为全局环境中的独立数据框,命名格式为sample1、sample2...sampleN for (i in 1:repeat_n) { assign(paste0("sample", i), all_sample_result[[i]]) }
内容的提问来源于stack exchange,提问作者AUS85
相关产品推荐
相关产品推荐

