2013-04-07 4 views
0

Я пишу скрипт, который должен построить большую матрицу. Я хочу взять вектор имен для каждого имени, получить данные из другого фрейма данных, выполнить некоторые операции над ним, а затем вернуть вектор данных для этого имени. , например:Эффективность 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 ГБ,
как-то я чувствую, что это занимает гораздо больше времени, чем нужно, это занимает несколько минут. Как я могу сделать это более эффективно?

+0

Вот аналогичный вопрос: HTTP: //stackoverflow.com/questions/5980240/performance-of-rbind-data-frame – JT85

+2

Не стареют матрицу внутри цикла. Сделайте его окончательным размером в начале, а затем, если вам нужно использовать цикл, просто назначьте его столбцы по ходу. –

+0

Кроме того, ваш 'apply' может быть заменен гораздо более быстрыми' colSums', и если вы переходите к предварительно распределенной матрице, 'as.data.frame',' colnames <-' и транспонирование не нужны. – cbeleites

ответ

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

Благодарим за быстрый ответ! примерно через час после написания вопроса я понял, что быстрее предварительно выделить матрицу и написать строку за строкой – SivanG

+1

@ user2253904 Искать «The In In In In In» от Patrick Burns. Глаз. –

+0

@ user2253904, пожалуйста, голосуйте и принимайте этот ответ, если вы довольны им. – flodel

Смежные вопросы