Я пишу скрипт, который должен построить большую матрицу. Я хочу взять вектор имен для каждого имени, получить данные из другого фрейма данных, выполнить некоторые операции над ним, а затем вернуть вектор данных для этого имени. , например:Эффективность 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 строк. Я запускаю свой код на своем Linux-сервере с объемом около 8 ГБ,
как-то я чувствую, что это занимает гораздо больше времени, чем нужно, это занимает несколько минут. Как я могу сделать это более эффективно?
Вот аналогичный вопрос: HTTP: //stackoverflow.com/questions/5980240/performance-of-rbind-data-frame – JT85
Не стареют матрицу внутри цикла. Сделайте его окончательным размером в начале, а затем, если вам нужно использовать цикл, просто назначьте его столбцы по ходу. –
Кроме того, ваш 'apply' может быть заменен гораздо более быстрыми' colSums', и если вы переходите к предварительно распределенной матрице, 'as.data.frame',' colnames <-' и транспонирование не нужны. – cbeleites