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
相关产品推荐
相关产品推荐

