REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

我们今天要介绍一种新的思维方式,来解决从一列数据中筛选出大于平均值的所有数据,

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

我们的这个公式用到了四个函数:REDUCE、LAMBDA、VSTACK、DROP。每个函数通过发挥自己不同的作用,最终达到我们要筛选的目的。

咱们先从宏观角度分析一下各个函数是咋起作用的?

第一 REDUCE函数会遍历A1:A5 数组范围

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

第三 VSTACK函数把我们筛选出来的结果重新构建一个数组

第四 DROP函数协助我们把最后的结果给整理好。

接下来从外到内,把这个公式一层层的给剥开

第一是 REDUCE函数

函数语法和参数

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

在本公式中的作用

参数一: “” 这里是一个空字符串,它的作用主要是可以作为累加器的初始状态

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

REDUCE 函数会一个个的处理这个范围内的每个元素

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

REDUCE的工作原理

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

LAMBDA函数

当前公式 LAMBDA(当前数组, 当前值, IF(当前值>AVERAGE(A1:A5), VSTACK(当前数组, 当前值), 当前数组))

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

当前数组: 这个参数表明的是截止到当前为止,累加器的积累值。

当前值: 指的是当前正在处理的A1:A5 数组中的元素

IF条件判断

IF(当前值>AVERAGE(A1:A5), VSTACK(当前数组, 当前值), 当前数组)

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

这个IF 函数就是要筛选出来符合条件的数据。

参数一 条件,当前值>AVERAGE(A1:A5)

我们要筛选的数据元素是要大于A1:A5 数组的平均值。

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

如果当前值符合条件的话,那么就把当前值垂直堆叠到当前数组中。

参数三 假值: 当前数组

如果当前数据不符合条件的话,就继续输出我们的当前数组,也就是抛弃掉当前元素。

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

VSTACK函数的主要作用是把我们筛选出来的数据垂直堆叠成一个数组。

具体的堆叠过程是这样的

初始状态:我们的当前数组是一个空字符串””

当出现第一个符合条件的值时,就会出现 VSTACK(“”, 符合条件的值) → 就会产生两行的数据

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

当后续有元素符合条件的时候:继续在刚才形成的数组后面添加上就可以。

从宏观视角来看,基本上就是这样,接下来我们从一个具体的例子来看它的详细执行步骤,

还是刚才的那个数组

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

第一计算数组的平均值

AVERAGE(A1:A5) = (10+20+15+25+12)/5 = 16.4

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

开始迭代

第1次迭代:处理数组内的第一个值 10

所以 当前值 = 10

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

本次迭代完成之后累加器的状态:””

第2次迭代:处理数组内的第二个值20

所以当前值 = 20

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

当前数组 = “”

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

执行 IF 函数的真值:VSTACK(“”, 20)

输出结果结果:{“”; 20}

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

本次迭代完成之后累加器的状态:{“”; 20}

第3次迭代:处理数组内的第三个值15

所以当前值 = 15

当前数组 = {“”; 20}

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

执行 IF 函数的的假值:返回当前数组{“”; 20}

本次迭代完成之后累加器的状态:{“”; 20}

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

第4次迭代:处理数组内的第四个值25

所以当前值 = 25

当前数组 = {“”; 20}

条件判断:当前值25 是否大于平均值 16.4,答案是是,输出逻辑值真值TRUE

执行 IF 函数的真值:VSTACK({“”; 20}, 25)

输出结果:{“”; 20; 25}

本次迭代完成之后累加器的状态:{“”; 20; 25}

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

第5次迭代:处理数组内的第五个值 12

所以当前值 = 12

当前数组 = {“”; 20; 25}

条件判断:12是否大于平均值16.4 ,答案是否,输出逻辑值 FALSE

执行 IF 函数的假值 :返回当前数组{“”; 20; 25}

本次迭代完成之后累加器的状态:{“”; 20; 25}

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

到此为止,数组内的所有元素我们否处理完了, REDUCE最终输出结果

{“”; 20; 25}

我们看到最终的输出结果第一个是一个空格,这个显然不是我们要的。这个时候加入一个 DROP 函数把它给去掉。

DROP函数语法

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

DROP函数的作用是删除删除数组中的指定行数。

所以在我们完整的公式前面加一个 DROP 函数,

DROP(REDUCE(…), 1)

参数一数组: 就是我们刚才用 REDUCE函数的结果{“”; 20; 25}

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

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

REDUCE+LAMBDA函数组合轻松实现复杂的条件筛选功能

还会有其他方法,在这里我们主要是学习一种新的思维方式,如何具体的应用到自己的实际工作中,还需要自己多多思考,好了,今天的分享到此结束,对您有协助的话,点个赞吧!

© 版权声明

相关文章

1 条评论

  • 头像
    元元妈 读者

    讲解的很详细

    无记录
    回复