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

