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

如何用splitstackshape::stratified()获取R语言分层拆分后的测试集?

解决splitstackshape::stratified()获取测试集的问题

有三种简单方法可以拿到对应的测试集,按需选择:

方法一:利用行名提取

给stratified()加keep.rownames = TRUE参数,保留原数据的行名,再通过行号差集生成测试集:

library(splitstackshape)

set.seed(40)
# 抽样时保留原数据行名,结果会新增一列"rn"
Train_with_rn <- stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75, keep.rownames = TRUE)
# 提取训练集对应的原数据行号
train_row_numbers <- as.numeric(Train_with_rn$rn)
# 生成最终训练集(去掉多余的rn列)
Train <- Train_with_rn[, -which(names(Train_with_rn) == "rn")]
# 测试集就是原数据中不在训练集行号里的部分
Test <- Data[-train_row_numbers, ]

方法二:新增唯一标识列

给原数据加一个唯一id列,抽样后通过id匹配筛选测试集:

library(splitstackshape)

set.seed(40)
# 给原数据添加唯一id列
Data$row_id <- 1:nrow(Data)
# 执行分层抽样
Train <- stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)
# 筛选出id不在训练集里的行作为测试集
Test <- Data[!Data$row_id %in% Train$row_id, ]
# 清理临时添加的id列(可选)
Train$row_id <- NULL
Test$row_id <- NULL
Data$row_id <- NULL

方法三:用dplyr的anti_join筛选

如果你的数据没有重复行,也可以用dplyr的anti_join直接取训练集的补集:

library(splitstackshape)
library(dplyr)

set.seed(40)
Train <- stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)
# 提取所有不在训练集中的行作为测试集
Test <- anti_join(Data, Train)

注意:如果原数据存在完全重复的行,方法三可能会误删重复项,这时候优先用前两种基于行号的方法更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:20:29