REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能
我们今天要介绍一种新的思维方式,来解决从一列数据中筛选出大于平均值的所有数据,

在单元格中输入公式DROP(REDUCE("",A1:A5,LAMBDA(当前数组,当前值,IF(当前值>AVERAGE(A1:A5),VSTACK(当前数组,当前值),当前数组))),1),回车就可以得到结果

我们的这个公式用到了四个函数:REDUCE、LAMBDA、VSTACK、DROP。每个函数通过发挥自己不同的作用,最终达到我们要筛选的目的。
咱们先从宏观角度分析一下各个函数是咋起作用的?
第一 REDUCE函数会遍历A1:A5 数组范围

第二 LAMBDA函数定义我们的筛选规则

第三 VSTACK函数把我们筛选出来的结果重新构建一个数组
第四 DROP函数帮助我们把最后的结果给整理好。
接下来从外到内,把这个公式一层层的给剥开
首先是 REDUCE函数
函数语法和参数

在本公式中的作用
参数一: "" 这里是一个空字符串,它的作用主要是可以作为累加器的初始状态

参数二: A1:A5 这是我们要处理的数组

REDUCE 函数会一个个的处理这个范围内的每个元素
参数三: LAMBDA函数它的主要作用是定一个规则,这个规则就是如何来处理这些元素。

REDUCE的工作原理
REDUCE函数主要是进行迭代处理,它会把数组中的每个元素一个个的给提取出来,然后用 lambda函数定义好的规则去处理,当 lambda函数处理完成之后,就会把得到的返回值作为下一次迭代的初始值,这个过程会持续循环,直到最后一个元素处理完成。
LAMBDA函数
当前公式 LAMBDA(当前数组, 当前值, IF(当前值>AVERAGE(A1:A5), VSTACK(当前数组, 当前值), 当前数组))

当前数组: 这个参数表示的是截止到当前为止,累加器的积累值。
当前值: 指的是当前正在处理的A1:A5 数组中的元素
IF条件判断
IF(当前值>AVERAGE(A1:A5), VSTACK(当前数组, 当前值), 当前数组)

这个IF 函数就是要筛选出来符合条件的数据。
参数一 条件,当前值>AVERAGE(A1:A5)
我们要筛选的数据元素是要大于A1:A5 数组的平均值。

参数二 真值,VSTACK(当前数组, 当前值)

如果当前值符合条件的话,那么就把当前值垂直堆叠到当前数组中。
参数三 假值: 当前数组
如果当前数据不符合条件的话,就继续输出我们的当前数组,也就是抛弃掉当前元素。

VSTACK函数的主要作用是把我们筛选出来的数据垂直堆叠成一个数组。
具体的堆叠过程是这样的
初始状态:我们的当前数组是一个空字符串""
当出现第一个符合条件的值时,就会出现 VSTACK("", 符合条件的值) → 就会产生两行的数据

当后续有元素符合条件的时候:继续在刚才形成的数组后面添加上就可以。
从宏观视角来看,基本上就是这样,接下来我们从一个具体的例子来看它的详细执行步骤,
还是刚才的那个数组

首先计算数组的平均值
AVERAGE(A1:A5) = (10+20+15+25+12)/5 = 16.4

开始迭代
第1次迭代:处理数组内的第一个值 10
所以 当前值 = 10

条件判断:当前值 10 是否大于平均值 16.4 ,答案是否,输出 FALSE

执行 IF 函数的假值:返回当前数组""

本次迭代完成之后累加器的状态:""
第2次迭代:处理数组内的第二个值20
所以当前值 = 20

当前数组 = ""
条件判断:当前值 20是否大于平均值 16.4,答案是是,输出逻辑值TRUE

执行 IF 函数的真值:VSTACK("", 20)
输出结果结果:{""; 20}

本次迭代完成之后累加器的状态:{""; 20}
第3次迭代:处理数组内的第三个值15
所以当前值 = 15
当前数组 = {""; 20}
条件判断:当前值 15是否大于平均值 16.4,答案是否,输出逻辑值 FALSE
执行 IF 函数的的假值:返回当前数组{""; 20}
本次迭代完成之后累加器的状态:{""; 20}

第4次迭代:处理数组内的第四个值25
所以当前值 = 25
当前数组 = {""; 20}
条件判断:当前值25 是否大于平均值 16.4,答案是是,输出逻辑值真值TRUE
执行 IF 函数的真值:VSTACK({""; 20}, 25)
输出结果:{""; 20; 25}
本次迭代完成之后累加器的状态:{""; 20; 25}

第5次迭代:处理数组内的第五个值 12
所以当前值 = 12
当前数组 = {""; 20; 25}
条件判断:12是否大于平均值16.4 ,答案是否,输出逻辑值 FALSE
执行 IF 函数的假值 :返回当前数组{""; 20; 25}
本次迭代完成之后累加器的状态:{""; 20; 25}

到此为止,数组内的所有元素我们否处理完了, REDUCE最终输出结果
{""; 20; 25}
我们看到最终的输出结果第一个是一个空格,这个显然不是我们要的。这个时候加入一个 DROP 函数把它给去掉。
DROP函数语法

DROP函数的作用是删除删除数组中的指定行数。
所以在我们完整的公式前面加一个 DROP 函数,
DROP(REDUCE(...), 1)
参数一数组: 就是我们刚才用 REDUCE函数的结果{""; 20; 25}

参数二行数: 这里输入 1。表示我们要删除第一行

看最后的结果:{20; 25}

还会有其他方法,在这里我们主要是学习一种新的思维方式,如何具体的应用到自己的实际工作中,还需要自己多多思考,好了,今天的分享到此结束,对您有帮助的话,点个赞吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
