gpt4 book ai didi

performance - r:嵌套索引的 for 循环操作运行速度超慢

转载 作者:行者123 更新时间:2023-12-03 15:18:37 24 4
gpt4 key购买 nike

我有一个操作,我想为数据框的每一行运行,更改一列。我是一个 apply/ddply/sqldf 人,但是当循环有意义时我会使用它们,我认为这是其中之一。这种情况很棘手,因为要更改的列取决于按行更改的信息;根据一个单元格中的信息,我应该只更改该行其他十个单元格中的一个。有 75 列和 20000 行,该操作需要 10 分钟,而我脚本中的每个其他操作需要 0-5 秒,最多 10 秒。我已经将我的问题简化为下面非常简单的测试用例。

n <- 20000
t.df <- data.frame(matrix(1:5000, ncol=10, nrow=n) )
system.time(
for (i in 1:nrow(t.df)) {
t.df[i,(t.df[i,1]%%10 + 1)] <- 99
}
)

10 列需要 70 秒,ncol=50 时需要 360 秒。太疯狂了。循环是错误的方法吗?有没有更好、更有效的方法来做到这一点?

我已经尝试将嵌套项 (t.df[i,1]%%10 + 1) 初始化为 for 循环之外的列表。它节省了大约 30 秒(共 10 分钟),但使上面的示例代码更加复杂。所以它有帮助,但它不是解决方案。

我目前最好的想法是在准备这个测试用例时出现的。对我来说,只有 10 列是相关的(75-11 列是不相关的)。由于运行时间在很大程度上取决于列数,因此我可以在排除不相关列的数据框上运行上述操作。这将使我下降到一分钟多一点。但是“带有嵌套索引的 for 循环”甚至是考虑我的问题的最佳方式吗?

最佳答案

似乎真正的瓶颈是以 data.frame 的形式存储数据。我假设在您的实际问题中,您有一个令人信服的理由使用 data.frame。有什么方法可以将数据转换为可以保留在矩阵中的方式?

顺便说一句,很好的问题和一个很好的例子。

下图说明了在矩阵上的循环比在 data.frames 上快了多少:

> n <- 20000
> t.df <- (matrix(1:5000, ncol=10, nrow=n) )
> system.time(
+ for (i in 1:nrow(t.df)) {
+ t.df[i,(t.df[i,1]%%10 + 1)] <- 99
+ }
+ )
user system elapsed
0.084 0.001 0.084
>
> n <- 20000
> t.df <- data.frame(matrix(1:5000, ncol=10, nrow=n) )
> system.time(
+ for (i in 1:nrow(t.df)) {
+ t.df[i,(t.df[i,1]%%10 + 1)] <- 99
+ }
+ )
user system elapsed
31.543 57.664 89.224

关于performance - r:嵌套索引的 for 循环操作运行速度超慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com