Excel中如何对数组列计算后用HSTACK重组可变数量的列?
对数组每列执行返回列向量的计算并重组数组
需求:对数组的每一列执行自定义计算(计算结果为列向量,而非单个值),再将所有处理后的列重新组合成新数组。BYCOL函数无法满足需求,因为它仅支持返回单个值。
通用解决方案
使用REDUCE遍历数组的每一列,对每列执行自定义计算后,通过HSTACK将处理后的列逐步拼接成最终数组。核心逻辑是:
- 用第一列的计算结果作为初始值
- 遍历剩余列,每次将当前列的计算结果拼接到已有结果中
示例1:累积求和(CUMSUM)场景
假设自定义累积求和函数为:
=LAMBDA(arr, SCAN(0, arr, LAMBDA(a,b,a+b)))
针对原数组$A$6#,执行每列累积求和并重组的公式:
=LET( array, $A$6#, cumsum, LAMBDA(col, SCAN(0, col, LAMBDA(a,b,a+b))), REDUCE( cumsum(CHOOSECOLS(array, 1)), SEQUENCE(1, COLUMNS(array)-1, 2), LAMBDA(res, col_idx, HSTACK(res, cumsum(CHOOSECOLS(array, col_idx)))) ) )
执行后会将每列的累积求和结果横向拼接,得到目标输出。
示例2:布林带(BOLLINGER)场景
自定义布林带函数:
=LAMBDA(arr, VSTACK( AVERAGE(arr)-STDEV.P(arr), AVERAGE(arr), AVERAGE(arr)+STDEV.P(arr) ) )
针对原数组$A$6#,执行每列布林带计算并重组的公式:
=LET( array, $A$6#, bollinger, LAMBDA(col, VSTACK(AVERAGE(col)-STDEV.P(col), AVERAGE(col), AVERAGE(col)+STDEV.P(col))), REDUCE( bollinger(CHOOSECOLS(array, 1)), SEQUENCE(1, COLUMNS(array)-1, 2), LAMBDA(res, col_idx, HSTACK(res, bollinger(CHOOSECOLS(array, col_idx)))) ) )
执行后会将每列的布林带三个值(下限、均值、上限)作为列,横向拼接成最终数组。
原代码失败原因
你之前的REDUCE代码仅对原数组的列做了直接拼接,没有对列执行自定义计算。只需将CHOOSECOLS(array,v)替换为自定义函数(CHOOSECOLS(array,v))即可解决问题。
内容的提问来源于stack exchange,提问作者snth
相关产品推荐
相关产品推荐

