rbind的效率

rbind的效率,r,performance,rbind,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(tmp

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

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行。我正在实验室linux服务器上运行代码,内存约为8GB,

不知怎的,我觉得这比它应该花的时间要长得多,需要几分钟。如何才能更有效地执行此操作?

正如评论所指出的,一次只增长一行对象比覆盖预分配对象的部分要慢得多。像这样的东西应该可以工作——尽管没有任何测试数据,很难确定

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)
    }
allNew=matrix(NA,ncol=ncol(X)-1,nrow=length(list));
适用于(i/1:长度(列表))
{

名称这里有一个类似的问题:不要在循环中增长矩阵。在开始时将其设置为最终大小,然后如果必须使用循环,只需在运行时将其分配到列中即可。此外,您的
apply
可以被速度快得多的
colSums
,如果您选择预分配的矩阵,
as.data.frame
colname谢谢你的快速回复!写下问题大约一个小时后,我意识到预先分配矩阵和逐行重写会更快line@user2253904搜索Patrick Burns的“R地狱”。大开眼界。@user2253904,如果你满意,请投票并接受这个答案。