我正在尝试随机将数据框分为两部分。例如,我想将70%的随机数据放入一个数据框中,将另外30%的数据放入另一个数据框中。有没有快速的方法可以做到这一点?原始数据框中的行数超过800000。我已经尝试使用for循环,从行数中选择随机数,然后使用rbind()将该行绑定到第一个(70%)数据框,并从原始数据框中删除它以获得另一个(30%)数据框。但是这样非常慢。是否有相对快速的方法可以做到这一点?
尝试
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, ]
我是在ExperimenteR的回答基础上进行拓展的,该回答看起来很可靠。然而,有一个问题是sample
函数使用的概率是不完全确定的,这有些奇怪。以此为例:
>sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.7, 0.3))
您会期望TRUE
和FALSE
的数量分别为70和30。但实际情况往往不是这样:
>table(sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.7, 0.3)))
FALSE TRUE
34 66
如果你不要求非常精确,那么这样做就可以了。但是如果你想要精确的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, ]
ind <- sample(c(rep(TRUE,ceiling(nrow(data)*0.7)),rep(FALSE,floor(nrow(data)*0.3))))
代码。 - moodymudskipper