Performance 大R数据帧的赋值

Performance 大R数据帧的赋值,performance,r,for-loop,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

在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分配给我的数据帧,在我试图解决的实际问题中,计算和其他一些东西更复杂,并且依赖于另一个数据帧。我的问题是如何在循环中高效地插入数据帧,我也很好奇为什么插入速度如此之慢。

答案是矢量化:

data[,2] = 2
data[,3] = 3
对我来说马上就结束了。对于解释语言(如R)中的循环,速度非常慢。通过直接分配向量(即向量化)执行此类操作要快得多


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

在我的实际问题中,我为这个数据帧分配了一些我从其他数据中计算出来的内容。我知道我可以用你上面写的来分配所有相同的值,但是我的值都不同,我需要一个接一个地分配它们。for循环并不慢,它是由赋值引起的复制。@Davor如果你想要一个准确的答案,请扩展你上面的例子。这回答了您上面提出的问题,尽管这不是您真正的问题。我对我的问题进行了编辑,以便更清楚地了解我实际提出的问题。只要计算结果是数据长度的向量[,2],这仍然可以正常工作。。说明原因。如果您无法提供与您的情况实际相符的示例,则没有人能够帮助您。在第一个代码段中,我确实初始化了数据帧。如果在第一个代码段之后执行strdata,则为10000 obs。三个变量中的一个。看,简短的回答是R不是C,所以在C中快速的技术在R中可能慢。如果我不得不猜测,你的问题的真正解决方案将是完全重新考虑如何计算插入的值。但我们显然无能为力,因为你没有向我们提供关于这个主题的任何信息。@joran我很清楚R不是C。如果你知道为什么它这么慢,请详细说明。这里发生了什么样的争论?为什么以同样的方式读取数据帧很快,但即使数据帧已预先分配,写入也不快?