do.call 比 Reduce 快?
测试开头



测试结尾
蒲公英的约定

1引言
在处理大数据的时候,我们往往会使用 *apply
家族函数及多线程等等操作,对于循环的结果可以使用 Reduce 或者 do.call 来合并结果。
在处理数据的时候我发现 do.call 竟然比 Reduce 快了不少,可以节约大量时间!
2示例
使用 Reduce 合并结果:
options(future.globals.maxSize= 5000e6)
system.time({future_lapply(1:50000, function(x){
tmp <- center_df[x,]
if(tmp$end5 >= tmp$st_pos & tmp$end3 <= tmp$sp_pos){
pos_new = c(tmp$end5:tmp$end3)
score = 1/tmp$len
tmp_score <- data.table(type=tmp$type,rname=tmp$rname,pos_new,score)
return(tmp_score)
}else{}
}) %>% Reduce('rbind',.) %>%
data.table() %>%
.[,.(sum_density = sum(score)),by = .(type,rname,pos_new)] -> center_score_df})
用户 系统 流逝
82.35 1.24 83.52
使用 do.call 合并结果:
system.time({future_lapply(1:50000, function(x){
tmp <- center_df[x,]
if(tmp$end5 >= tmp$st_pos & tmp$end3 <= tmp$sp_pos){
pos_new = c(tmp$end5:tmp$end3)
score = 1/tmp$len
tmp_score <- data.table(type=tmp$type,rname=tmp$rname,pos_new,score)
return(tmp_score)
}else{}
}) %>% do.call('rbind',.) %>%
data.table() %>%
.[,.(sum_density = sum(score)),by = .(type,rname,pos_new)] -> center_score_df})
用户 系统 流逝
18.53 0.34 18.89
将近快了 4 倍多!见识了,一天一个小技巧!


欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦,数据代码已上传至QQ群,欢迎加入下载。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀南京的春
◀pysam 读取 bam 文件准备 Ribo–seq 质控数据
◀...
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!