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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:18:15