Excel无辅助表统计移动平均离群点的数组公式实现方法
解决方案
方案1:Excel 365/2021及以上版本单公式实现(无需任何辅助列/表)
直接在每行的统计结果单元格输入单条公式即可得到离群点总数,无需创建任何辅助表/辅助列,公式量从原来的190万条直接降到1万条,文件体积和运算速度都会大幅优化。
假设你的val1在B列、val200在GU列、数据从第2行开始,第2行的统计结果放在GV2单元格,公式如下:
=SUM(BYCOL(SEQUENCE(,190,11),LAMBDA(k, LET( w,INDEX(B2:GU2,SEQUENCE(,10,k-10)), v,INDEX(B2:GU2,k), IF(OR(v<AVERAGE(w)-2*STDEV.S(w),v>AVERAGE(w)+2*STDEV.S(w)),1,0) ) )))
适配说明:如果需要和你原有逻辑完全对齐(兼容文本值视为0的规则),可将公式中的
AVERAGE替换为AVERAGEA,STDEV.S替换为STDEVA即可。
输入完成后下拉填充到所有行即可,所有计算都在单个单元格内完成,完全不需要额外辅助表。
方案2:低版本Excel兼容方案(仅需数组公式,无辅助表)
如果你使用的是2019及更早版本的Excel,没有动态数组函数,可以使用数组公式实现,同样不需要辅助表,还是以上述单元格位置为例,公式如下:
=SUMPRODUCT(--( OFFSET(B2,0,10,1,190)<(SUBTOTAL(1,OFFSET(B2,0,COLUMN(OFFSET(B2,0,0,1,190))-1,1,10))-2*SUBTOTAL(7,OFFSET(B2,0,COLUMN(OFFSET(B2,0,0,1,190))-1,1,10))) + OFFSET(B2,0,10,1,190)>(SUBTOTAL(1,OFFSET(B2,0,COLUMN(OFFSET(B2,0,0,1,190))-1,1,10))+2*SUBTOTAL(7,OFFSET(B2,0,COLUMN(OFFSET(B2,0,0,1,190))-1,1,10))) ))
输入完成后按Ctrl+Shift+Enter确认为数组公式,再下拉填充即可。
注意:低版本数组公式性能略低于365版本的动态数组公式,仅建议无365环境时使用。
性能优化建议
- 如果你的表格是Excel结构化表,可将公式中的单元格引用替换为结构化引用,公式的可读性和稳定性会更高
- 1万行批量运算时可以暂时将Excel计算模式调整为「手动」,所有公式填充完成后按F9一次性计算,减少中间重复运算的耗时
- 如果数据后续不需要更新,计算完成后可以选择性粘贴为值,彻底消除公式运算开销,进一步缩小文件体积
内容的提问来源于stack exchange,提问作者Rd1000
相关产品推荐
相关产品推荐

