我正在尝试初始化一个包含2列和40行的data.frame,我将继续添加行.这是我的代码 -
result.frame = as.data.frame(matrix(ncol=2, nrow=10))
names(result.frame) = c("ID", "Value")
for (i in 1:10) {
value = somefunction(i)
rbind(result.frame, c(i, value))
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我只是得到一个包含NA的data.frame.另外,我在SO上读到,动态增长的结构是用R编码的最有效方法之一.如果这是真的,那么完成这样的事情的正确方法是什么?
非常感谢!
你没有把结果框分配给任何东西!下面的代码执行我认为您试图显示的内容.但是,正如您所提到的,效率低下.
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))
}
Run Code Online (Sandbox Code Playgroud)
而是将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)
}
Run Code Online (Sandbox Code Playgroud)
breif timinigs:
> 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
>
Run Code Online (Sandbox Code Playgroud)
除了时间效率之外,随着数据变得越来越大,存在重要的内存问题.要执行rbind操作,必须复制数据,这意味着在连续块中需要两倍的内存.分配给已创建的data.frame没有此问题.
| 归档时间: |
|
| 查看次数: |
12282 次 |
| 最近记录: |