* 计算一批集合中包含指定成员的次数

有一个用Excel表格表示的赛事分组图,从C1:V13,每6列表示四个选手的一桌比赛,1-16表示16位选手的编号。


A B C D E F G H I J K L M N O P Q R S T U V
1 1 8 14 11 12 2 1 4 3 13 10 15 16 6 5
2 2 3 1 5 7 9 11 13 15 2 4 6 8 10 12
3 3 11 8 14 15 3 6 9 12 13 16 5 2 1 4
4 4 9 13 1 5 4 8 12 16 3 7 10 14 2 6
5 5 3 2 11 16 14 7 10 15 1 6 12 13 8 5
6 6 2 14 3 9 7 1 13 8 5 11 6 4 15 12
7 7 12 6 13 7 4 5 12 11 1 8 15 9 2 16
8 8 1 9 2 10 7 15 8 16 3 11 4 12 5 13

请计算出任意两名选手在同一桌的次数,用矩阵图表示。


A B C D E F G H I J K L M N O P Q R
11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
12
1
13
2 2
14
3 2 3
15
4 2 2 2
16
5 2 1 1 2
17
6 1 2 1 2 2
18
7 2 0 2 0 1 1
19
8 2 1 0 2 1 1 2
20
9 3 2 2 0 1 1 0 1
21
10 1 1 1 0 0 0 2 0 1
22
11 0 1 2 3 2 1 0 2 1 0
23
12 1 0 2 3 1 3 1 2 1 1 3
24
13 3 1 0 0 3 2 2 1 2 1 1 2
25
14 0 1 2 0 0 0 2 2 1 2 2 1 0
26
15 1 0 0 0 0 0 2 3 2 2 2 1 2 2
27
16 0 3 1 1 1 0 1 2 0 1 1 1 2 0 2

使用 SPL XLL,在C13输入公式:

````

=spl("=?1.conj(~.group((#-1)\6)).count( ~.contain( ?2,?3) )",$C$1:$V$8,$B13,C$11)

````

上面公式只算出了一格,需要通过拖拽算出其他格,并避开对角线(自己和自己同桌无意义)。注意整个矩阵会重复算两遍,所以只要拖拽出三角形区域就可以了。

Picture1png

函数 group 用于分组,# 表示当前成员的序号,~ 表示当前成员,函数 contain 计算指定的多个项目是否都是某个序列的成员。

来源:https://www.reddit.com/r/excel/comments/1cceq2q/how_to_count_how_many_times_two_players_are_at/