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

