将数据随机分成两部分

10

我正在尝试随机将数据框分为两部分。例如,我想将70%的随机数据放入一个数据框中,将另外30%的数据放入另一个数据框中。有没有快速的方法可以做到这一点?原始数据框中的行数超过800000。我已经尝试使用for循环,从行数中选择随机数,然后使用rbind()将该行绑定到第一个(70%)数据框,并从原始数据框中删除它以获得另一个(30%)数据框。但是这样非常慢。是否有相对快速的方法可以做到这一点?

2个回答

16

尝试

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, ]

3
抢先一步了。在处理80万个案例时也能快速运作。 - thelatemail
非常快速地运行。即使我多次在循环中重复执行它。谢谢。 - gregorp

7

我是在ExperimenteR的回答基础上进行拓展的,该回答看起来很可靠。然而,有一个问题是sample函数使用的概率是不完全确定的,这有些奇怪。以此为例:

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

您会期望TRUEFALSE的数量分别为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, ] 

2
尝试使用 ind <- sample(c(rep(TRUE,ceiling(nrow(data)*0.7)),rep(FALSE,floor(nrow(data)*0.3)))) 代码。 - moodymudskipper
部分正确,但最终需要是100的因数或倍数。你的更健壮,加一。 - Workhorse
抱歉,我的方法最终需要是10的倍数的数字。 - Workhorse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接