初始化并附加到R中的data.frame

Pra*_*har 1 r

我正在尝试初始化一个包含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编码的最有效方法之一.如果这是真的,那么完成这样的事情的正确方法是什么?

非常感谢!

Jus*_*tin 6

你没有把结果框分配给任何东西!下面的代码执行我认为您试图显示的内容.但是,正如您所提到的,效率低下.

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没有此问题.