FREQUENCY函数的精彩应用

FREQUENCY函数以一列垂直数组返回一组数据的频率分布,在之前的文章中,我们详细解了该函数的基础语法及应用示例 。下面,我们以示例解FREQUENCY函数的一些精彩应用 。
示例1:统计不同数值的个数
如下图1所示的工作表,在单元格区域A1:A8中有一列数值,我们需要使用公式算出该区域中不同数值的个数 。此时,可以使用公式:
=SUM(–(FREQUENCY(A1:A8,A1:A8)>0))
计算结果为5,如图1中的单元格D2所示 。在列表中,不同的数值是1、3、5、6、7共5个 。

FREQUENCY函数的精彩应用

文章插图
图1
注意到,这个公式不是数组公式,但它在计算过程中能够生成数组 。
首先,公式会转换成:
=SUM(–(FREQUENCY({1;1;3;5;6;3;1;7},{1;1;3;5;6;3;1;7})>0))
由于FREQUENCY函数对于重复的值统计的数为0,并且计数区间有8个,会产生9个统计数字 。因此,上面的式子又被转换成:
=SUM(–({3;0;2;1;1;0;0;1;0}>0))
从上面式子中的数组可知,要统计的区域中有3个1,2个3,1个5,1个6,1个7 。这个数组与0比较,生成逻辑值数组:
=SUM(–({TRUE;FALSE; TRUE; TRUE; TRUE; FALSE; FALSE; TRUE; FALSE}))
公式中的双减号将逻辑值转换成数字,其中TRUE转换成1,FALSE转换成0,得到:
=SUM({1;0;1;1;1;0;0;1;0})
求和得到结果5 。
也可以使用SUMPRODUCT函数:
=SUMPRODUCT(–(FREQUENCY(A1:A8,A1:A8)>0))
获得同样的结果 。
上面的例子中,统计的数值全部都是数字,如果单元格区域中除了数字外,还有文本呢?例如下图2所示的工作表,求单元格区域A1:A10中不同数值的个数 。
FREQUENCY函数的精彩应用

文章插图
图2
这里使用的是数组公式:
=SUM(–(FREQUENCY(IF(A1:A10<>””,MATCH(“~”& A1:A10,A1:A10 & “”,0)),ROW(A1:A10)-ROW(A1)+1)>0))
公式中,A1:A10<>””检查是否是空单元格以便忽略空单元格,得到数组:
{TRUE; TRUE; TRUE; TRUE; TRUE; TRUE; FALSE; TRUE; TRUE; TRUE}
在MATCH函数中的波浪号(~)用于预防单元格中起始字符为通配符的情况 。如果你确定单元格中的值不会以通配符开始,那么可以使用””&代替”~”& 。如果你确定单元格中的值都是文本,那么也不需要””& 。注意,如果任何单元格中包含通配符(特别是*),那么公式可能失败 。
在MATCH函数的参数lookup_array中通过使用&””将值强制转换为文本 。如果单元格中的值都是文本,则可将其删除 。
MATCH函数返回每个数值出现的位置:
{1;2;2;4;4;6;7;8;9;9}
那么,公式中IF函数转换为:
IF({TRUE; TRUE; TRUE; TRUE; TRUE; TRUE; FALSE; TRUE; TRUE; TRUE},{1;2;2;4;4;6;7;8;9;9})
结果为:
{1;2;2;4;4;6;FALSE;8;9;9}
FALSE值对应着空单元格 。
公式中的ROW(A1:A10)-ROW(A1)+1)返回一个连续的整数值组成的数组:
{1;2;3;4;5;6;7;8;9;10}
此时,公式转换为:
=SUM(–(FREQUENCY({1;2;2;4;4;6;FALSE;8;9;9},{1;2;3;4;5;6;7;8;9;10})>0))
与前面的例子所一样,公式再转换为:
=SUM(–({1;2;0;2;0;1;0;1;2;0;0}>0))
式子评估为:
=SUM(–{TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;FALSE})
得到:
=SUM({1;1;0;1;0;1;0;1;1;0;0})
最后得到结果:
6
示例2:统计不重复值的个数
不重复的值指单元格区域中只出现1次的值 。例如,下图3所示的工作表,在单元格区域A1:A8中数值5、6、7只出现了1次,因此有3个不重复值 。统计单元格区域A1:A8中不重复值个数的公式为:

推荐阅读