r - lapply 和 do.call 运行很慢?

标签 r data.table 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 是一个因子,它有大约 3,500 个独特的级别。我想,对于每个级别的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)

我确定我做错了什么来减慢速度。我还没等它完成,因为我相信它可以更快。有任何想法吗?

最佳答案

由于我正处于传福音的心情......这就是快速data.table解决方案如下:

library(data.table)
dt <- data.table(nuc, key="gene_id")

dt[,list(A=min(start),
         B=max(end),
         C=mean(pctAT),
         D=mean(pctGC),
         E=sum(length)), by=key(dt)]
#      gene_id        A        B         C         D   E
# 1: NM_032291 67000042 67108547 0.5582567 0.4417433 283
# 2:       ZZZ 67000042 67108547 0.5582567 0.4417433 283

关于r - lapply 和 do.call 运行很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054208/

相关文章:

r - 与 dplyr : turn one row into many 中的 'summarise' 相反

r:重叠赋值

r - 将 apply 函数与 lapply 结合使用 : calculate mean of groups in df

r - 如何使用 lapply 函数将回归输出列表转换为 broom::tidy 的数据框?

html - 使用 R 从雅虎财经抓取头条新闻和日期

r - 在 R 中调用 "install.packages()"时从 Github 安装一些部件

r - 我可以使用 R data.table 连接功能来选择行并执行一些操作吗?

r - 性能提升

r - 在数据表的子集中迭代计算

r - 选择级别数等于 1 的分类变量