R语言函数中用if处理字符串,拆分数据集为三个数据框遇问题
解决R语言数据拆分函数的问题
看起来你的数据拆分函数存在几个关键问题,导致没有得到预期的train、test、validate数据集,我帮你逐一修正并解释:
原代码的核心问题
- 第二个
createDataPartition错误地使用了原数据集cleaned.data,而不是拆分后剩下的bufferDF——这会导致test集和validate集与train集重叠,而且比例完全不符合预期(本该从剩余30%里各分50%,结果变成从全量数据里再分50%)。 - 函数内部创建的数据集变量是局部变量,没有通过
return()返回,所以调用函数后根本拿不到结果。 - 代码只处理了
type == "train"的情况,缺少test和validate的分支,而且原代码的if语句不完整。
修正后的函数(按类型返回单数据集)
如果你希望通过传入type参数获取对应数据集,可以用这个版本:
library(caret) splitData <- function(type) { set.seed(1337) # 第一步:拆分出70%的训练集 rowTrain <- createDataPartition(y = cleaned.data$CHURN, p = 0.7, list = FALSE) cdTrain <- cleaned.data[rowTrain,] bufferDF <- cleaned.data[-rowTrain,] # 第二步:从剩余30%数据里拆分出50%作为测试集,剩下的是验证集 rowTest <- createDataPartition(y = bufferDF$CHURN, p = 0.5, list = FALSE) cdTest <- bufferDF[rowTest,] cdValidate <- bufferDF[-rowTest,] # 根据传入的type返回对应数据集,同时处理无效参数 if(type == "train") { return(cdTrain) } else if(type == "test") { return(cdTest) } else if(type == "validate") { return(cdValidate) } else { stop("参数无效!请选择 'train', 'test' 或 'validate'") } } # 使用示例 train_df <- splitData("train") test_df <- splitData("test") validate_df <- splitData("validate")
更高效的版本:一次返回三个数据集
更推荐这种方式——只调用一次函数就能得到所有三个数据集,避免重复执行拆分逻辑,也能确保数据集拆分的一致性:
library(caret) splitData <- function() { set.seed(1337) # 拆分训练集 rowTrain <- createDataPartition(y = cleaned.data$CHURN, p = 0.7, list = FALSE) cdTrain <- cleaned.data[rowTrain,] bufferDF <- cleaned.data[-rowTrain,] # 拆分测试集和验证集 rowTest <- createDataPartition(y = bufferDF$CHURN, p = 0.5, list = FALSE) cdTest <- bufferDF[rowTest,] cdValidate <- bufferDF[-rowTest,] # 返回包含三个数据集的列表 list( train = cdTrain, test = cdTest, validate = cdValidate ) } # 使用示例 data_splits <- splitData() train_df <- data_splits$train test_df <- data_splits$test validate_df <- data_splits$validate
注意事项
- 确保已经安装并加载了
caret包(先运行install.packages("caret"),再执行library(caret)),因为createDataPartition是caret包提供的函数。 set.seed(1337)是为了确保拆分结果可复现,每次运行函数都会得到相同的数据集划分。
内容的提问来源于stack exchange,提问作者Nalhcal
相关产品推荐
相关产品推荐

