【问题标题】:R split data into 2 parts randomlyR将数据随机分成两部分
【发布时间】:2015-09-18 03:07:36
【问题描述】:

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

【问题讨论】:

    标签: r random split


    【解决方案1】:

    试试

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

    【讨论】:

    • 打败我。扩展到 800K 案例时也能快速运行。
    • 运行速度非常快。即使我多次循环重复它。谢谢。
    【解决方案2】:

    我正在以 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 &lt;- sample(c(rep(TRUE,ceiling(nrow(data)*0.7)),rep(FALSE,floor(nrow(data)*0.3))))
    • 部分正确,是的,最终需要是 100 的因数或倍数的数字。你的更强大,+1。
    • 抱歉的意思是说我的方法最终需要的数字是 10 的倍数。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2023-03-23
    • 2012-08-28
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多