Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中随机将数据帧分为3组_R_Random Sample - Fatal编程技术网

在R中随机将数据帧分为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

目标:将数据帧随机分成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 <- 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