【问题标题】:Is there a faster way in R of creating large dataframe without loops?R中是否有更快的方法来创建没有循环的大型数据框?
【发布时间】:2020-07-25 06:25:00
【问题描述】:

下面是我目前正在做的一个例子,它相当慢。我认为必须有比这更有效的东西,因为它需要大约 95 秒才能运行。

df <- data.frame(matrix(vector(), 1000, 1000))     
for (i in (1:1000)) {
        for (j in (i:1000)) {
                df[i, j]  <-   i *1000 + j  
                df[j, i]  <-   df[i, j]  

        }
}

还要注意 i*1000+j 只是为了说明。我在那里做其他事情,但这是一个依赖于以 1:1000 获得所有对的计算。谢谢。

【问题讨论】:

    标签: r performance loops


    【解决方案1】:

    考虑outer 重新分配矩阵返回的下三角。

    out_mat <- outer(1:1E3, 1:1E3, function(i,j) i * 1E3 + j)
    out_mat[lower.tri(out_mat)] <- t(out_mat)[lower.tri(t(out_mat))]
    df2 <- data.frame(out_mat)
    

    结果显示与 for 循环生成的 df 完全相同:

    identical(df, df2)
    # [1] TRUE
    

    但是,以上取决于您的实际计算,因为超出了简单的算术,outer 调用可能无法工作,具体取决于尺寸。

    【讨论】:

    • 这样要快得多。谢谢。我的实际计算是 ``` set.seed(42) dfA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多