R随机将数据分成2部分

gre*_*orp 8 random split r

我试图将我的数据框分成2个部分.例如,我想将70%的数据随机存入一个数据帧,另外30%的数据存入其他数据帧.有没有快速的方法来做到这一点?原始数据框中的行数超过800000.我尝试使用for循环,从行数中选择一个随机数,然后使用rbind()将该行绑定到第一个(70%)数据框并从原始数据帧中删除它以获得另一个(30%)数据帧.但这非常缓慢.有没有比这更快的方法呢?

Exp*_*teR 11

尝试

n <- 100
data <- data.frame(x=runif(n), y=rnorm(n))
ind <- sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.7, 0.3))
data1 <- data[ind, ]
data2 <- data[!ind, ]
Run Code Online (Sandbox Code Playgroud)

  • 打败我.当扩展到800K的情况下也可以快速工作. (3认同)

Wor*_*rse 6

我正在建立 ExperimenteR 的答案,它看起来很强大。然而,一个问题是该sample函数有点奇怪,因为它使用了不完全确定性的概率。以这个为例:

>sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.7, 0.3))
Run Code Online (Sandbox Code Playgroud)

您会期望数量TRUEFALSE值分别正好是 70 和 30。通常情况下,情况并非如此:

>table(sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.7, 0.3)))

 FALSE  TRUE 
    34    66 
Run Code Online (Sandbox Code Playgroud)

如果您不想非常精确,那也没关系。但是,如果你想确切地70%和30%,那么这样做,而不是:

v <- as.vector(c(rep(TRUE,70),rep(FALSE,30))) #create 70 TRUE, 30 FALSE
ind <- sample(v) #Sample them randomly. 
data1 <- data[ind, ] 
data2 <- data[!ind, ] 
Run Code Online (Sandbox Code Playgroud)

  • 尝试`ind &lt;-sample(c(rep(TRUE,ceiling(nrow(data)*0.7)),rep(FALSE,floor(nrow(data)*0.3))))` (2认同)