Tengo un marco de datos de aproximadamente 35,000 filas, por 7 columnas. se parece a esto:lapply y do.call funcionando muy lentamente?
cabeza (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 es un factor, que tiene alrededor de 3.500 niveles únicos. Quiero, para cada nivel de gene_id obtener el min(start)
, max(end)
, mean(pctAT)
, mean(pctGC)
y sum(length)
.
Intenté usar lapply y do.call para esto, pero me llevaría más de 30 minutos ejecutarlo. el código que estoy usando es:
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)
Estoy seguro de que estoy haciendo algo mal para frenar esto. No he esperado a que termine, ya que estoy seguro de que puede ser más rápido. ¿Algunas ideas?
Use 'tapply' - esto podría ser más rápida. – Andrie