如何高效生成10组50%随机划分的R语言训练-测试数据集对?
更简便的R语言实现10组50%训练/测试集划分方法
当然有更省心高效的写法啦!你现在重复写10遍几乎一样的代码,不仅麻烦还容易手抖写错变量名。给你分享两种简洁的实现思路:
方法一:基础循环实现
如果不想额外安装包,用基础R的循环就能搞定,把所有训练集和测试集统一存在列表里,方便后续调用:
# 设置随机种子,保证每次运行的划分结果一致 set.seed(123) n_all <- nrow(data3) # 创建空列表,用来存储10组训练集和测试集 train_list <- list() test_list <- list() # 循环生成10组划分 for (i in 1:10) { # 随机抽取50%的行索引作为训练集 train_idx <- sample(1:n_all, 0.5 * n_all, replace = FALSE) # 存入列表 train_list[[i]] <- data3[train_idx, ] test_list[[i]] <- data3[-train_idx, ] }
后续调用的时候,直接用train_list[[1]]就能拿到第一组训练集,test_list[[7]]拿到第七组测试集,比逐个命名traindata_1、traindata_2要整洁太多。
方法二:用caret包快速生成(推荐)
如果你经常做机器学习数据集划分,推荐用caret包的工具,它默认支持分层抽样(能保证训练集和测试集的类别分布和原数据一致),代码更简洁:
# 先安装并加载caret包(第一次用需要安装) # install.packages("caret") library(caret) set.seed(123) # createFolds生成10组训练集索引,returnTrain=TRUE表示返回的是训练集的位置 # 这里的y参数用来做分层抽样,你可以换成数据集中需要分层的列(比如标签列) folds <- createFolds(y = data3[, 1], k = 10, list = TRUE, returnTrain = TRUE) # 用lapply批量生成训练集和测试集 train_list <- lapply(folds, function(idx) data3[idx, ]) test_list <- lapply(folds, function(idx) data3[-idx, ])
如果不需要分层抽样,只需要在createFolds里加上stratify = FALSE就行。这种方法更符合R的向量化编程风格,代码量更少,也更专业。
额外小提示:如果你的数据集很大,也可以只存储划分的索引列表folds,后续需要数据的时候再提取,能节省不少内存空间哦~
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

