1

我正在尝试用 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))
}

当我运行它时,我只是得到一个包含 NA 的 data.frame。另外,我在 SO 上读到动态增长的结构是在 R 中编码效率最低的方法之一。如果这是真的,那么完成这样的事情的正确方法是什么?

非常感谢!

4

2 回答 2

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))
}

而是将 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的没有这个问题。

于 2012-10-11T14:43:14.273 回答
3

发生的情况是: NA 来自matrix,因为您尚未使用任何值进行初始化。并且rbind不做任何事情,因为您已经丢弃了返回值。

result.frame = data.frame( ) 
for( i in 1:10 ) {
  value = somefunction( i )
  result.frame = rbind( result.frame, c( i, value ) )
}
colnames( result.frame ) <- c( "ID", "Value" )

除非我们在这里谈论数百万次操作,否则不要担心效率。通常,计算比 R 在这里需要做的这个小内存重新分配要密集得多。

此外,您的效率也很重要,当您需要首先计算需要多少行矩阵时,效率会受到影响。

于 2012-10-11T14:43:54.367 回答