如何按因子水平平衡data.frame中的观测样本?
操作术语与通用抽样方法
正确术语
这个操作属于分层欠采样(Stratified Undersampling),也可称为固定数量分层抽样(Fixed-Size Stratified Sampling)。它是分层抽样的一种特殊应用:针对类别不平衡的数据集,对样本量过多的类别进行向下抽样(欠采样),最终让各因子水平的样本量趋于一致,解决手动抽样不适用于大数据集或多因子水平的问题。
通用实现方法
以下提供两种适用于任意规模数据集、任意多因子水平的R语言实现方案:
方案1:Base R原生实现
无需额外安装包,通过拆分-抽样-合并的逻辑完成:
# 定义每个类别目标抽样数量 target_n <- 50 # 按class分层抽样并合并结果 sampled_data <- do.call(rbind, lapply(split(data, data$class), function(subset) { # 自动适配样本量不足的类别(取全部样本) sample_size <- min(nrow(subset), target_n) subset[sample(nrow(subset), sample_size), ] }))
方案2:tidyverse/dplyr简洁实现
适合习惯tidy语法的用户,代码更直观:
library(dplyr) target_n <- 50 sampled_data <- data %>% group_by(class) %>% slice_sample(n = target_n) %>% # 无放回抽样,自动处理样本量不足的情况 ungroup()
结果验证
执行后可通过以下代码查看各类别样本量:
table(sampled_data$class)
针对你的示例数据,输出会是A:50, B:50, C:50, D:50,总样本量200,符合需求。
内容的提问来源于stack exchange,提问作者Javier Fajardo
相关产品推荐
相关产品推荐

