rbind的效率

时间:2013-04-07 06:58:20

标签: r performance rbind

我正在编写一个必须构建大型矩阵的脚本。我想为每个名称取一个名称向量,从不同的数据框中获取数据,对其进行一些操作,然后返回该名称的数据向量。 例如:

allNew=matrix(ncol=ncol(X)-1);
for(name in list)
    {
    tmpdata=all[grep(names,list$Names),];
    data=(as.data.frame(apply(tmpdata[,2:(ncol(tmpdata)-1)],2,sum))==nrow(tmpdata))*1
    colnames(data)=name;
        data=t(data);
        allNew=rbind(allNew,data);
    }

名称列表的长度在10000范围内,并且对于每个名称,tmpdata具有1-5行。我在我的labs linux服务器上运行我的代码,大约8 GB ram,
不知何故,我觉得这需要的时间比它应该花费的时间长,需要几分钟。我怎样才能更有效地做到这一点?

1 个答案:

答案 0 :(得分:1)

正如评论所指出的那样,一次一行地增加一个对象比覆盖预先分配的对象的部分要慢很多。这样的事情应该有效 - 虽然没有任何测试数据,但很难确定。

allNew=matrix(NA, ncol=ncol(X)-1, nrow = length(list));
for(i in 1:length(list))
    {
    name <- names(list)[i]
    tmpdata=all[grep(names,list$Names), ]
    data=(as.data.frame(apply(tmpdata[, 2:(ncol(tmpdata)-1)], 2, sum))==nrow(tmpdata))*1
    colnames(data)=name
    allNew[i, ] = t(data)
    }