分配给大R数据帧

时间:2013-05-23 20:28:50

标签: performance r for-loop

在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分配给我的数据帧,在我试图解决计算的实际问题中()和somethingElse()有点复杂并依赖于另一个数据帧。我的问题是关于在循环中有效插入数据框架(我也很好奇为什么这么慢)。

1 个答案:

答案 0 :(得分:1)

答案是矢量化:

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

立即为我完成。对于像R这样的解释语言中的循环,这些循环很慢。通过直接分配矢量(即矢量化)来执行这种操作要快得多。

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