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

  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函数组合轻松实现复杂的条件筛选功能

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