lapply и do.call работают очень медленно?

У меня есть фрейм данных, содержащий около 35 000 строк по 7 столбцов. это выглядит так:

head(nuc)

  chr feature    start      end   gene_id    pctAT    pctGC length
1   1     CDS 67000042 67000051 NM_032291 0.600000 0.400000     10
2   1     CDS 67091530 67091593 NM_032291 0.609375 0.390625     64
3   1     CDS 67098753 67098777 NM_032291 0.600000 0.400000     25
4   1     CDS 67101627 67101698 NM_032291 0.472222 0.527778     72
5   1     CDS 67105460 67105516 NM_032291 0.631579 0.368421     57
6   1     CDS 67108493 67108547 NM_032291 0.436364 0.563636     55

gene_id — это фактор, который имеет около 3500 уникальных уровней. Я хочу, чтобы для каждого уровня gene_id получить min(start), max(end), mean(pctAT), mean(pctGC )и sum(length).

Я пытался использовать для этого lapply и do.call, но это заняло +30 минут. код, который я использую:

nuc_prof = lapply(levels(nuc$gene_id), function(gene){
  t = nuc[nuc$gene_id==gene, ]
  return(list(gene_id=gene, start=min(t$start), end=max(t$end), pctGC =
              mean(t$pctGC), pct = mean(t$pctAT), cdslength = sum(t$length))) 
})
nuc_prof = do.call(rbind, nuc_prof)

Я уверен, что делаю что-то не так, чтобы замедлить это. Я не ждал, пока он закончится, так как уверен, что это может быть быстрее. Есть идеи?

5
задан Matt Dowle 18 June 2012 в 23:53
поделиться