frequency计算各家庭成员人数

同学们,大家好。今天继续学习frequency的用法,用来计算各家庭成员人数。先来看下源数据和统计后的效果。下图左表是源数据,是一个户籍表。右表是结果表,用来统计每户的家庭成员人数。

首先看一下数据源的结构,开始是一个户主,然后是各家庭成员,接下来是又一个户主,然后又是他的家庭成员,以此类推。每一个户主到下个户主之间的就是他的家庭成员。我们可以用下个户主的行号减去上一个户主的行号就是上一个户主的家庭成员人数,这种思路可以,但是到最后一个户主的时候,找不到他的下一个户主,这就是一个问题。

而frequency这个函数,对这种数据结构计数还是挺方便的。下面来说一下它的用法。对于D列户主那一列,我们可以用一对多查询公式来完成,在D2单元格输入公式=INDEX(A:A,SMALL(IF(B$2:B$19="户主",ROW($2:$19),4^8),ROW(A1)))&"",按ctrl+shift+enter三键结束,向下填充。相信大家对一对多查询掌握的差不多了,就不再解释公式了。

下面就让我们看下各家庭成员人数是怎么算出来的,在E2单元格输入公式=INDEX(FREQUENCY(-ROW($2:$19),IF(B$2:B$19="户主",-ROW($2:$19))),ROW(A1)),按ctrl+shift+enter三键结束,向下填充。

这里主要用到的函数就是if和frequency,if函数作为frequency的第2参数,用来判断B2:B19是否等于"户主",如果成立返回对应的负行号,也就是在行号前面加个负号,这个很关键,如果不成立就是返回false,if函数返回的结果如下{-2;FALSE;FALSE;FALSE;FALSE;-7;FALSE;-9;-10;FALSE;FALSE;FALSE;-14;FALSE;FALSE;-17;-18;FALSE}。

frequency的第1参数是-ROW($2:$19),也就是{-2;-3;-4;-5;-6;-7;-8;-9;-10;-11;-12;-13;-14;-15;-16;-17;-18;-19}。下面frequency返回的结果才是关键。也就是它的结果是怎么返回的。

我们说过frequency的第2参数是区间间隔,用来分段的。而且会忽略逻辑值和文本,也就是false被忽略,不参与分段。那么参与分段的就剩下数字{-2;-7;-9;-10;-14;-17;-18}。它现在是降序排序,frequency在计算的时候会在内部升序排序,然后统计各区间的个数,但最后返回的值还是与原来的区间间隔相对应。

运算原理看下图,第2参数忽略逻辑值false后,就如A列所示,内部运算的时候,先升序排序,就是D列所示。然后查询第1参数中小于等于-18的有几个,有-18和-19两个,大于-18小于等于-17的有-17一个,以此类推,就是E列所示的结果,它只是内部运算统计的结果。但是最后返回的结果还要和第2参数对应,也就是B列所示。看下图红色箭头所示。不知这里大家能否理解。

那么frequency最后返回的结果就是{5;2;1;4;3;1;2;0},大家有没有发现这几个数字刚好对应的就是各家庭成员的人数呢,当然最后一个0不算。那么接下来就可以用index返回第1个值5,然后返回第2个值2,第3个值1,以此类推。最后的公式就是我上面说的那个,大家可以慢慢理解下这个函数的计算过程。

这个公式其实没有引用D列的单元格,它只是按照D列的固定顺序来一一对应的。如果你说我的户主是乱序的,或者从A列中随便查找一个户主的家庭成员个数,那么这个公式就不行了,还需要进一步的处理。

对于户主是乱序排序的,我也给出了一个公式,在F2单元格输入公式=INDEX(FREQUENCY(-ROW($2:$19),-(B$2:B$19="户主")*ROW($2:$19)),MATCH(D2,A:A,)-1),不用三键,向下填充,完成。大家可以把D2单元格换成A列的任一户主尝试一下。

关于统计各家庭成员人数,还有其他很多方法可以做到,大家也可以自己想一下。我也在文件中列举了一些其他方法,感兴趣的同学可以下载查看。

链接:

https://pan.baidu.com/s/1Whdz3Bfui8buDigoUy-EWw

提取码:9dij

(0)

相关推荐