我怎样才能防止歌厅为数据帧较大增长很慢rbind()?我怎样才能防止歌厅为数据帧较大增长很慢rbin

2019-05-12 02:53发布

我只有1行中的数据帧。 为了这一点,我开始用rbind添加行

df #mydataframe with only one row
for (i in 1:20000)
{
    df<- rbind(df, newrow)

}

这得到我长得很慢。 这是为什么? 我怎么能做出这种类型的代码更快?

Answer 1:

你是在地狱的第2圈 ,即没有预分配的数据结构。

以这种方式成长对象是R.一个非常非常糟糕的事情无论是预分配和插入:

df <- data.frame(x = rep(NA,20000),y = rep(NA,20000))

或者调整你的代码来避免这种增量另外行的。 如在我举的链接所讨论的,为缓慢的原因是,每次添加一个行时间,R需要找到新的存储的连续块以适应。地段“O拷贝该数据帧。



Answer 2:

我试过一个例子。 对于它的价值,它与用户的说法,将行插入到数据帧也很慢同意。 我不太明白这是怎么回事,因为我本来期望的分配问题王牌复制的速度。 任何人都可以任一复制本,或解释为什么下面的结果(rbind <追加<插入)。将一般为真,或解释为什么这不是一个代表性的例子(例如,数据帧太小)?

编辑 :第一次围绕忘了在对象初始化hell2fun到的数据帧,因此代码在做矩阵运算而不是数据帧的操作,这是快得多。 如果我得到一个机会,我将扩展对比数据框与矩阵。 在第一段的定性说法成立,但。

N <- 1000
set.seed(101)
r <- matrix(runif(2*N),ncol=2)

## second circle of hell
hell2fun <- function() {
    df <- as.data.frame(rbind(r[1,])) ## initialize
    for (i in 2:N) {
        df <- rbind(df,r[i,])
    }
}

insertfun <- function() {
    df <- data.frame(x=rep(NA,N),y=rep(NA,N))
    for (i in 1:N) {
        df[i,] <- r[i,]
    }
}

rsplit <- as.list(as.data.frame(t(r)))
rbindfun <-  function() {
    do.call(rbind,rsplit)
}

library(rbenchmark)
benchmark(hell2fun(),insertfun(),rbindfun())

##          test replications elapsed relative user.self 
## 1  hell2fun()          100  32.439  484.164    31.778 
## 2 insertfun()          100  45.486  678.896    42.978 
## 3  rbindfun()          100   0.067    1.000     0.076 


文章来源: How can I prevent rbind() from geting really slow as dataframe grows larger?