您没有将结果框架分配给任何东西!下面的代码做了我认为你试图展示的事情。但是,正如您所提到的,它效率低下。
result.frame = as.data.frame(matrix(ncol=2, nrow=10))
names(result.frame) = c("ID", "Value")
for (i in 1:10) {
value = 2 * i
result.frame = rbind(result.frame, c(i, value))
}
而是将 data.frame 设置为您想要的完整大小并分配给它:
result.frame = as.data.frame(matrix(ncol=2, nrow=20))
names(result.frame) = c("ID", "Value")
for (i in 11:20) {
value = 2 * i
result.frame[i,] = c(i, value)
}
时间安排:
> result.frame=data.frame()
> system.time(for(i in 1:10000){result.frame=rbind(result.frame, c(i,i*2))})
user system elapsed
9.844 0.000 9.874
> result.frame=as.data.frame(matrix(ncol=2, nrow=10000))
> system.time(for(i in 1:10000){result.frame[i,]=c(i,i*2)})
user system elapsed
7.041 0.056 7.120
>
除了时间效率之外,随着数据变大,还存在重要的内存问题。要执行该rbind
操作,必须复制数据,这意味着连续块中需要两倍的内存。分配给已经创建data.frame
的没有这个问题。