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