矩阵乘积函数mmult应用6:条件计数
小伙伴们,大家好。现在是特殊时期,希望大家做好防护措施,尽量不外出,更不要聚集,在家也可以找一些事情做,比如看电视,或做一顿好吃的,再不行学一下excel
。言归正传,今天来学习下mmult在条件计数方面的应用。还是来看几个例子。
1.求各年级出现的次数以及不重复的年级数
如下图所示,统计各年级出现的次数。对于这个问题,相信大家都会做。用countif完成就可以了,公式为=COUNTIF(A$3:A$10,A3),下拉填充就可以了。区域数组的公式为=COUNTIF(A3:A10,A3:A10),要先选中B3:B10,然后按三键完成。如果用mmult来完成,选中C3:C10,输入公式=MMULT(N(A3:A10=TRANSPOSE(A3:A10)),ROW(3:10)^0),按三键完成。
mmult的第1参数N(A3:A10=TRANSPOSE(A3:A10))返回的结果如下图array1所示,就是用竖向的年级和转置后横向的年级进行相等的比较,相等的返回true,不相等的返回false。n将true转为1,false转为0。就是下图的效果。然后对下图每一行的值求和就得到了对应年级的次数。其实和countif的意思也差不多,就是取出每个年级,然后和整个年级的区域进行判断。
mmult的第2参数ROW(3:10)^0返回的结果如上图array2所示,就是竖向的8个1。然后就是用mmult对2个参数进行矩阵相乘,其实就是对第1参数每一行的值就和。如果你不明白我说的意思,还是画矩形图。
不重复的年级数怎么算呢?如果是用countif,公式为=SUMPRODUCT(1/COUNTIF(A3:A10,A3:A10)),得到的结果是3,也就是不重复的年级有一年级,二年级,三年级,共3个年级。如果是用mmult,方法也是一样的,公式为=SUM(1/MMULT(N(A3:A10=TRANSPOSE(A3:A10)),ROW(3:10)^0)),按三键完成。countif得到的结果和mmult得到的结果是一样的。
2.求各年级&各班出现的次数以及不重复的年级&班级数
如下图所示,现在要同时算年级和班级出现的次数,是个双条件计数的问题。所以常规的方法要用到countifs,选中C14:C21,输入公式=COUNTIFS(A14:A21,A14:A21,B14:B21,B14:B21),区域数组按三键完成。用mmult来完成,选中D14:D21,输入公式=MMULT(N(A14:A21&B14:B21=TRANSPOSE(A14:A21&B14:B21)),ROW(14:21)^0),按三键完成。
mmult的第1参数N(A14:A21&B14:B21=TRANSPOSE(A14:A21&B14:B21))返回的结果如下图array1所示,是将年级和班级2个条件连接成1个条件,然后再向第1题那样的方式比较,也就是将竖向的和转置后横向的进行比较。最后用mmult对每1行的值求和,就得到了对应年级和班级的次数。
第2参数ROW(14:21)^0返回的结果如上图array2所示,还是返回纵向的8个1,和第1参数的列数相同。
用mmult的话,还可以有另一个公式,=MMULT((A14:A21=TRANSPOSE(A14:A21))*(B14:B21=TRANSPOSE(B14:B21)),ROW(14:21)^0),区域数组三键结束。
第1参数(A14:A21=TRANSPOSE(A14:A21))*(B14:B21=TRANSPOSE(B14:B21))是2部分的相乘,第1部分是年级比较后的结果,第2部分是班级比较后的结果,然后2部分相乘就是把2个条件合并在一起,和第1个连接的公式是一样的意思。我就不再截图了,大家可以自己研究一下。
那么不重复的年级&班级数怎么算呢?和之前的方法是一样的,公式为=SUM(1/MMULT(N(A14:A21&B14:B21=TRANSPOSE(A14:A21&B14:B21)),ROW(14:21)^0)),按三键结束,结果为6。如下图所示,三年级1班有2个是重复的,所以只算1个。还有2个一年级2班是重复的,也只能算1个。
3.在下表所有的彩票期数中,求和我们所选的彩票号码有任意2个相同的一共有多少期,分别是哪几期
我们所选的彩票号码为2,4,7,18,21,28这6个数字,每一期的彩票号码都是不重复的数字。只要每期的号码中有任意2个数字在我们所选的号码中出现就算做1期。比如第3期中的2和21在我们选的号码中出现,它就符合。再比如第9期中有2,7,18,28四个数字出现,就不符合要求,只要2个出现的。在I26输入公式=SUM(N(MMULT(COUNTIF(B25:G25,B28:G38),ROW(1:6)^0)=2)),完成。
mmult的第1参数COUNTIF(B25:G25,B28:G38)返回的结果如下图所示,就是用countif在我们所选的号码区域中统计每期号码出现的次数,返回的结果只能是0或1。结果是1的说明这个数字在我们所选的号码中出现了。然后用mmult对每一行的值求和,就得到了每1期有几个数字在我们所选的号码中出现。
mmult的第2参数ROW(1:6)^0返回纵向的6个1,和第1参数的列数相同。mmult最后返回的结果为{0;1;2;2;2;1;1;2;4;2;0},如下图H列所示,这样就得到每1期中有几个数字在我们所选的号码中出现。我们只需要有2个出现的,所以只需要计算等于2的有多少个就可以了,也就是判断mmult返回的结果是否等于2,成立的返回true,不成立的返回false。然后用n函数将true转为1,false转为0。最后用sum求和就得到了一共有多少期。
一共有多少期算出来了,分别是哪几期怎么算呢?其实就是一对多的查询,只要把上图黄色区域等于2的期数查询出来就可以了,用万金油公式=INDEX(A:A,SMALL(IF(MMULT(COUNTIF(B$25:G$25,B$28:G$38),ROW($1:$6)^0)=2,ROW($28:$38),4^8),ROW(A1)))&"",按三键结束,下拉填充,完成。
文件链接:
https://pan.baidu.com/s/1MPhl-0FDRHAmqjatz4MuTQ
提取码:6ys1