我想创建一个公式,该公式将根据数据表创建相似度矩阵。以下是数据示例以及所需的输出。数据行表示模块化类算法的结果。我需要我的输出来计算两个国家共享相同类别值的月数(可以是任何值,只要它们相等)除以总月数。
输入模块化类别
jan feb mar apr may
USA 0 1 2 4 3
UK 0 3 2 3 3
AU 0 2 2 2 3
CH 1 0 1 1 2
EG 2 3 0 0 1
输出相似度矩阵
USA UK AU CH EG
USA 1
UK 0.6 1
AU 0.6 0.6 1
CH 0 0 0 1
EG 0 0.2 0 0 1
我没有尝试过任何公式,因为我不知道从哪里开始。我读过有关 countifs 和 mmult 的内容,但我不知道哪个最合适。
最佳答案
是的,有一种方法可以使用 SUM()
、IF()
、COUNT()
以及使用数组公式。
您可以使用的基本公式是(假设您的顶部数组是 A1:F6
,包括标题,因此数据位于 A2:F6
中):
{=SUM(IF($B$2:$F$2=$B2:$F2,1,0))/COUNT($B$2:$F$2)}
使用数组公式,您可以使 IF()
函数在匹配时返回 1,在不匹配时返回 0,从而迭代一行中的每个元素。 SUM()
将匹配项相加,然后除以处理的单元格数量的 COUNT()
即可得出相似度指数。
上面的示例适用于示例中顶部的美国/美国单元格,您可以用它来填充,但每个新的对角线都需要调整以将固定行号更改为新行。因此,英国专栏的顶部将是:
{=SUM(IF($B$3:$F$3=$B3:$F3,1,0))/COUNT($B$3:$F$3)}
如果您提前知道有多少列/国家/地区,则可以删除 COUNT()
。
注意:您无需键入花括号。输入完公式后,您必须按Ctrl-Shift-Enter 在编辑时,让它们出现并将公式视为数组公式。因此,这些公式通常称为CSE 公式(Ctrl-Shift-Enter)。
更新:
您也可以使用 INDIRECT()
和 COLUMN()
填充单元格的单个公式来完成此操作。
{=SUM(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0))/COUNT(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2)))}
这利用了列号与行号相同的事实,提供了转置。
更新2:
实际上,可以消除 COUNT()
并将 SUM()
替换为 AVERAGE()
,因为所有匹配项均为 1,即平均值是正确的值。
所以这适用于所有单元格:
{=AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0))}
更新3:
如果您非常需要在上对角线上不显示任何内容,从而制作一个下三角 block ,那么您可以使用 IF()
包装上述公式,检查该列是否更大比该行并使单元格为空白在这种情况下。然后,您可以用公式填充整个 block ,它将看起来正确,无需删除。
{=IF(COLUMN(B2)>ROW(B2),"",AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0)))}
关于excel公式如何建立相似度矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19496654/