0

在 R 中,我通过以下方式创建数据框:

data <- data.frame(dummy=rep('dummy',10000))
data$number = 0
data$another = 1

当我运行一个为数据框分配值的for循环(遍历行)时,我的代码运行得无限慢

calculation <- function() {2}
somethingElse <- function() {3}

system.time(
 for (i in 1:10000) {
   data[i,2]=calculation()
   data[i,3]=somethingElse()
 }
)

上面的代码片段在我的笔记本电脑上运行了 20 秒。在 C 或 Java 等其他语言中,这会立即完成。为什么R语言这么慢?我记得读过 R 逐列存储矩阵(例如,与 C 不同,它是逐行存储的)。但是,我仍然对为什么需要这么多时间感到困惑。我的 data.frame 不应该舒适地适合内存(避免缓慢的磁盘写入行为)吗?

作为我的问题的延续,我想要求一种快速的方法来逐行填充我的数据帧,如果存在的话。

编辑:请注意,我并没有尝试将常量 2​​ 和 3 分配给我的数据框,在我试图解决的实际问题中,calculation() 和 somethingElse() 有点复杂,并且取决于另一个数据框。我的问题是关于在循环中有效地插入数据帧(我也很好奇为什么这么慢)。

4

1 回答 1

1

答案是矢量化:

data[,2] = 2
data[,3] = 3

立即为我完成。像 R 这样的解释语言中的 for 循环非常慢。通过直接分配一个向量(即向量化)来执行这种操作要快得多。

用新语言编程需要新的思维方式。您的方法呼吸编译语言,不需要 for 循环。

于 2013-05-23T20:31:56.717 回答