在R中随机将数据帧分为3组
目标:将数据帧随机分成3个样本在R中随机将数据帧分为3组,r,random-sample,R,Random Sample,目标:将数据帧随机分成3个样本 一个样本包含60%的行 其他两个样本占行数的20% 样品不得与其他样品重复(即未经更换的样品) 下面是一个笨拙的解决方案: allrows <- 1:nrow(mtcars) set.seed(7) trainrows <- sample(allrows, replace = F, size = 0.6*length(allrows)) test_cvrows <- allrows[-trainrows] testrows <- sa
- 一个样本包含60%的行
- 其他两个样本占行数的20%
- 样品不得与其他样品重复(即未经更换的样品)
allrows <- 1:nrow(mtcars)
set.seed(7)
trainrows <- sample(allrows, replace = F, size = 0.6*length(allrows))
test_cvrows <- allrows[-trainrows]
testrows <- sample(test_cvrows, replace=F, size = 0.5*length(test_cvrows))
cvrows <- test_cvrows[-which(test_cvrows %in% testrows)]
train <- mtcars[trainrows,]
test <- mtcars[testrows,]
cvr <- mtcars[cvrows,]
allrows您需要精确的分区吗?如果没有,
set.seed(7)
ss <- sample(1:3,size=nrow(mtcars),replace=TRUE,prob=c(0.6,0.2,0.2))
train <- mtcars[ss==1,]
test <- mtcars[ss==2,]
cvr <- mtcars[ss==3,]
不是最漂亮的解决方案(特别是对于较大的样本),但它确实有效
n = nrow(mtcars)
#use different rounding for differet sizes/proportions
times =rep(1:3,c(0.6*n,0.2*n,0.2*n))
ntimes = length(times)
if (ntimes < n)
times = c(times,sample(1:3,n-ntimes,prob=c(0.6,0.2,0.2),replace=FALSE))
sets = sample(times)
df1 = mtcars[sets==1,]
df2 = mtcars[sets==2,]
df3 = mtcars[sets==3,]
n=nrow(mtcars)
#对不同的尺寸/比例使用不同的舍入
时间=rep(1:3,c(0.6*n,0.2*n,0.2*n))
n次=长度(次)
如果(n次
无需更换的选项
使用插入符号包
library(caret)
inTrain <- createDataPartition(mtcars$mpg, p = 0.6, list = FALSE)
train <- mtcars[inTrain, ]
inTest <- createDataPartition(mtcars$mpg[-inTrain], list = FALSE)
test <- mtcars[-inTrain,][inTest, ]
cvr <- mtcars[-inTrain,][-inTest, ]
库(插入符号)
inTrain如果您希望获得每个组的精确且可复制的数字(尽可能接近您所能达到的比例进行分割,记住组大小必须是整数),而不是每次执行随机分割时允许组大小随机变化,请尝试:
sample_size <- nrow(mtcars)
set_proportions <- c(Training = 0.6, Validation = 0.2, Test = 0.2)
set_frequencies <- diff(floor(sample_size * cumsum(c(0, set_proportions))))
mtcars$set <- sample(rep(names(set_proportions), times = set_frequencies))
在某些情况下,如本例,您无法精确拆分60%、20%、20%的数据,但此方法保证两个20%集的大小彼此之间的间隔不应超过一个:
> set_frequencies
Training Validation Test
19 6 7
检查它是否按预期工作:
> table(mtcars$set)
Test Training Validation
7 19 6
(基于Ben Bolker的回答和liori的评论。)我会使用split
来不丢失对它们的跟踪mycars=setNames(split(mtcars,ss),c(“train”,“test”,“cvr”)
分区不需要精确。这是可行的,我喜欢@Frank的附录。如果你想要一个精确的分区,用:ss替换ss
行。一个更简单的时间可能是findInterval(1:n,n*c(0.6.8))
这可能很有趣:@Frank这是一个非常巧妙的答案。不过,我不想硬编码分区行,我会记住它以备将来使用。
mtcars <- split(mtcars, mtcars$set)
mtcars_train <- mtcars[mtcars$set == "Training", ]
mtcars_validation <- mtcars[mtcars$set == "Validation", ]
mtcars_test <- mtcars[mtcars$set == "Test", ]
> set_frequencies
Training Validation Test
19 6 7
> table(mtcars$set)
Test Training Validation
7 19 6