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

如何按block分组抽取无重复的80%/20%样本至train、test数据集?

按Block分层拆分训练/测试集的解决方案

你需要的是分层抽样——按block分组后分别抽取约80%样本作为训练集,剩余作为测试集,且保证样本无重复。之前用sample_frac出问题,大概率是没结合分组操作,导致抽样逻辑不对。下面给两种可靠的实现方法:

方法一:用dplyr包(推荐,代码简洁直观)

先确保安装了dplyr包,没有的话先执行install.packages("dplyr"),然后按以下步骤操作:

library(dplyr)

# 按block分组,每组抽取约80%样本作为训练集(replace=FALSE确保不重复)
train_data <- mydata %>%
  group_by(block) %>%
  slice_sample(prop = 0.8, replace = FALSE) %>%
  ungroup()

# 测试集取训练集之外的所有样本,用anti_join自动匹配去重
test_data <- anti_join(mydata, train_data, by = c("variable", "block"))

方法二:Base R实现(无需额外装包)

如果不想依赖第三方包,可以用基础R的分组函数实现:

# 给数据集加行号,方便后续精准筛选
mydata$row_id <- 1:nrow(mydata)

# 按block分组,抽取每组约80%的行号
train_rows <- unlist(tapply(mydata$row_id, mydata$block, function(x) {
  # round()把比例转成整数,尽可能接近80%
  sample(x, size = round(length(x)*0.8), replace = FALSE)
}))

# 拆分训练/测试集
train_data_base <- mydata[mydata$row_id %in% train_rows, ]
test_data_base <- mydata[!mydata$row_id %in% train_rows, ]

# 清理临时加的row_id列
train_data_base$row_id <- NULL
test_data_base$row_id <- NULL

验证比例(可选)

你可以用以下代码查看每个block的抽样比例,确认是否接近80%:

# 查看训练集各block占原数据集的比例
prop.table(table(train_data$block), margin = table(mydata$block))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:54:26