做报表时,你可能要“按门店计算每月销售额”:先按门店分组,再逐组求和。麻烦在于,R每执行一次函数,都要处理名称查找、参数匹配等工作;组数一多,这些零碎开销就会累积。poorman这次分享的重点,是不用额外重型依赖,只靠base R把分组运算周边的工作压到更少。
传统的split-apply-combine——先拆组、逐组计算、再合并——会为每组创建一个data.frame,最后还要重新拼接。poorman的新写法只拆出计算所需的一列,循环内只做“减去本组均值”,再用一次unlist()合并,并恢复原始行序。换句话说,它没有消灭逐组循环,而是避免搬运整张表和制造大量小对象。
作者用10万行数据、10到1万个分组做基准测试,但供稿片段未给出两种分组实现的最终耗时。作为原理参照,文中另一个简单测试显示:整列乘二的向量化写法中位耗时59.02微秒,R层逐项循环为2.22毫秒,接近40倍;这说明减少解释器反复介入,确实可能带来明显收益。