在R中随机抽样数据帧为3组

Min*_*now 3 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 <- 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,]
Run Code Online (Sandbox Code Playgroud)

必须有一些更容易的东西,也许在一个包中. dplyrsample_frac功能,但似乎针对单个样本,而不是分成多个.

关闭,但不是这个问题的答案: R中有多个概率的随机样本

Ben*_*ker 9

你需要分区准确吗?如果不,

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,]
Run Code Online (Sandbox Code Playgroud)

应该这样做.

或者,正如@Frank在评论中所说,您可以split()将原始数据保留为列表的元素:

mycars <- setNames(split(mtcars,ss), c("train","test","cvr"))
Run Code Online (Sandbox Code Playgroud)

  • 我会用'split`不输"的轨道EM`mycars = setNames(分割(mtcars,SS),C( "火车", "测试", "CVR"))` (3认同)
  • 如果您想要精确分区,请将 `ss` 行替换为: `ss &lt;- sample(rep(1:3, diff(floor(nrow(yourdataset) * c(0, 0.6, 0.8, 1))))) ` (2认同)