今天讲讲Excel中的新函数:REDUCE函数。
这个函数也是伴随着LAMBDA函数使用的。
我们前面介绍LAMBDA函数的时候说过,LAMBDA函数让Excel本身构成了一个“函数式语言”(参见)。
在函数式语言中,MAP/REDUCE是非常“通用”的函数,几乎每种函数式编程语言都会实现这两个函数。
相对来说,从用户理解的角度,REDUCE函数比着MAP函数稍显复杂。
所以,我们先举一个非常简单的例子,来说明一下REDUCE函数的用法吧。
=REDUCE(0,A2:A5,LAMBDA(acc,v,acc+v))
像MAP函数一样,REDUCE函数的最后一个参数也是一个LAMBDA函数。这个函数:
LAMBDA(acc,v,acc+v)
接收两个参数:
acc
v
然后将这两个参数加起来(acc+v)作为返回值。
说的这么热闹,就是求和而已。
(没错,我们就用一个简单的求和方差函数excel公式,这样我们就可以集中精力关注REDUCE的逻辑了)。
再看这个REDUCE公式的前面两个参数:
0,
A2:A5
一个是常量0,一个是区域A2:A5
它们显然对应于后面的LAMBDA函数的两个参数:
acc,
v
因为A2:A5是个数组,所以,REDUCE肯定是循环数组中的每个值,将每个值当作lambda函数的参数v使用,分别跟acc求和。
那么这个acc=0又是干什么用的呢?
这是这个函数的稍微需要花点时间解释的地方。
我们来看一下这个函数的语法:
其中的数组就是我们的A2:A5,函数就是最后一个参数LAMBDA,关键就是这个:
initial_value
初始值?
什么的初始值?
原来,REDUCE函数在内部维护了一个东西,叫做“累加器”,英文叫做“accumulator“。
而在第三个参数LAMBDA函数里,接收的第一个参数根本不是那个”0“,而是这个accumulator,只不过,在这里,我们给这个accumulator一个初始值:0
这个函数的工作方式是这样的,
简单说明一下:
因为数组有四个元素,所以需要四步。
第一步,计算数组中的第一个元素:1。
accumulator采用初始值0,v的值就是数组的第一个元素:1,结果就是0+1=1。
第二步,计算数组中的第二个元素:2。
accumulator采用上一步的计算结果:1,v的值就是数组的第二个元素:2,结果就是1+2=3。
第三步,计算数组中的第三个元素:3。
accumulator采用上一步的计算结果:3,v的值就是数据的第三个元素:3,结果就是3+3=6。
第四步,计算数组中的第四个元素:4。
accumulator采用上一步的计算结果:6,v的值就是数据的第四个元素:4,结果就是6+4=10。
计算完成!
所以,REDUCE这个函数就是对第二个参数的数组做循环,循环中的计算方法就是LAMBDA函数中使用的逻辑。
注:大家不用被”累加器“这个名词给带偏了,LAMBDA的算法不仅仅限于加法,什么计算都是可以的。
一个例子
下面我们使用另外一个例子来说明一下为什么要使用REDUCE函数。
假设我们有下面的数据:
我们现在想计算一下其中的所有偶数的和,可以使用下面的公式:
=REDUCE(0,A2:A11,LAMBDA(acc,v,IF(ISEVEN(v),acc+v,acc)))
这个里面的逻辑就是LAMBDA函数了。
其中就是判断数组中的元素是否是偶数,如果是,就加在合计里。
这是结果:
那么,为什么要使用REDUCE函数呢。
首先,很多人可能会想,我可以采用数组公式呀,比如:
{=SUM(IF(ISEVEN(A2:A11),A2:A11,0))}
这是一个数组公式,需要CTRL+SHIFT+ENTER输入。
或者采用FILTER函数:
=SUM(FILTER(A2:A11,ISEVEN(A2:A11)))
但是,遗憾的是,这两种都不行。
因为ISEVEN函数也是不接受数组参数的。
当然,你可以改变个写法:
=SUM(FILTER(A2:A11,MOD(A2:A11,2)=0))
这次结果对了
我们总结一下:
这里我们用了三个非REDUCE函数来尝试做同样的结果,其中,前面两种都失败了,而后一种结果是对的。
而REDUCE和最后一个SUM(FILTER)相比有什么好处呢。
简单来说,用FILTER的时候方差函数excel公式,因为不能使用ISEVEN函数,所以必须绕个弯,使用MOD函数判断余数是否为0。
而REDUCE函数就比较直接,逻辑清晰一些。
实际上这是MAP/REDUCE函数的一种优势,可以跟LAMBDA结合,处理数组,避免了很多函数不能处理数组的问题。
另外,REDUCE函数还有一个好处,就是函数的逻辑可以重复使用。
如果我们通过名称定义了自定义函数:
SUMEVEN=LAMBDA(acc,v,IF(ISEVEN(v),acc+v,acc))
那么,上述的REDUCE函数就可以写成:
=REDUCE(0,A2:A11,SUMEVEN)
在任何需要这个逻辑的地方都可以通过这个自定义函数使用这个逻辑。当然,修改更加方便,只要在一个地方修改就可以了。
当然,这么做,还带来了另外一个好处,那就是公式的可读性更强了。
那么,REDUCE又是什么意思呢?
从名称上看,这个REDUCE不是非常好理解。不过有人认为这个函数是将一个数组或区域的值处理后变成了一个数值,所以才叫REDUCE。这么理解当然有一定道理。
在函数式编程语言中,REDUCE一般被看作“聚合”,英文是AGGREGATE,在Excel中专门有一个叫做AGGREGATE的函数。实际上,就是对一个数据库或者数据列表进行某种合计运算,包括:
求和
求乘积
求最大值(最小值)
求平均值
计数
求方差(标准差)
等等
当然,以上的计算在Excel中都有相应的函数。但是有时有需要对原始数据进行一番处理后,才能使用,这样往往会带来逻辑的复杂与多变。此时,可以使用REDUCE函数来执行这些计算。
·end·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410