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

R语言如何对退货产品数据集按0/1标签1:1比例随机抽样子集

实现逻辑

你的数据集标签列为data5.returnyesno(1=退回、0=未退回),要实现两类占比各50%的随机抽样,核心逻辑是:

  • 先统计两类样本的总数量,取较小值作为单类抽样量,最终子集总大小为该值的2倍,保证两类占比严格1:1
  • 分别对两类样本做无放回随机抽样,合并后得到符合要求的子集

代码实现

基础R版本

# 可选:设置随机种子保证抽样结果可复现
set.seed(123)

# 拆分两类样本
dat_0 <- dat[dat$data5.returnyesno == 0, ]
dat_1 <- dat[dat$data5.returnyesno == 1, ]

# 计算单类抽样量
sample_size <- min(nrow(dat_0), nrow(dat_1))

# 分别随机抽样
sample_0 <- dat_0[sample(nrow(dat_0), sample_size, replace = FALSE), ]
sample_1 <- dat_1[sample(nrow(dat_1), sample_size, replace = FALSE), ]

# 合并得到最终子集
final_sample <- rbind(sample_0, sample_1)

# 验证样本占比
table(final_sample$data5.returnyesno)

Tidyverse版本(dplyr)

library(dplyr)
set.seed(123)

# 计算单类抽样量
sample_size <- min(count(dat, data5.returnyesno)$n)

final_sample <- dat %>%
  group_by(data5.returnyesno) %>%
  slice_sample(n = sample_size, replace = FALSE) %>%
  ungroup()

# 验证样本占比
count(final_sample, data5.returnyesno)

超大数据集专用(data.table,性能最优)

library(data.table)
setDT(dat) # 转换为data.table格式
set.seed(123)

sample_size <- min(dat[, .N, by = data5.returnyesno]$N)

final_sample <- dat[, .SD[sample(.N, sample_size, replace = FALSE)], by = data5.returnyesno]

# 验证样本占比
final_sample[, .N, by = data5.returnyesno]

补充说明

  • 如果允许有放回抽样,把代码中的replace = FALSE改为replace = TRUE即可,这种场景下可以自定义更大的抽样量,只要保证两类抽取数量相同即可
  • 如果需要按订单、用户维度去重后再抽样,可以在抽样前先对data5.order_id/data5.customer_id列做去重处理

内容的提问来源于stack exchange,提问作者Estelle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:36:07