我想创建一个公式,它将从数据表中创建一个相似度矩阵。以下是所需输出后面的数据示例。数据行表示模块化类算法的结果。我需要我的输出来计算两个国家共享相同类别值的月数(只要它们相等就可以是任何值)除以总月数。
输入模块化类
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的内容,但我不知道什么是最合适的。
答案 0 :(得分:2)
我将提供正确方向的推动,而不是整个解决方案。我想你将能够从给定的公式推广解决方案。
我将输入矩阵放在A1:F6中。然后我建立了一个中间矩阵。 A9只是“第1栏中的匹配”。
=== edit:在列===
中使用月份名称然后我复制了月份名称jan ..可能在B10:F10。还有美国..在A11中的EG .. A15。
然后在B12,乐趣开始了。我把一个公式=IF(B3=B2,1,0)
。这样做的是,如果B3 = B2,则在单元格中放置1,否则为0。然后我从B12到F12直接填写,我得到以下行计算:
1 0 1 0 1
你会注意到这些是英国=美国的月份。
如果您选择B12并填写B15然后将B12 .. B15填入F15,您将获得每个国家与其相邻邻居之间的差异。我的矩阵原来是:
jan feb mar apr may
USA
UK 1 0 1 0 1
AU 1 0 1 0 1
CH 0 0 0 0 0
EG 0 0 0 0 0
如果您将行数之和除以国家/地区数量,您将得到3 / 5,3 / 5,0 / 5,0 / 5。这些对应于第一列的输出矩阵,0.6,0.6,0,0。
答案 1 :(得分:2)
是的,有一种方法可以使用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()
,即可获得相似度指数。
上面的示例是针对您示例中的顶级USA / USA单元格,您可以填写,但每个新对角线需要调整以将固定行号更改为新行。所以英国专栏的顶部是:
{=SUM(IF($B$3:$F$3=$B3:$F3,1,0))/COUNT($B$3:$F$3)}
如果您事先了解了多少列/国家,则可以删除COUNT()
。
注意:您不要输入花括号。输入完公式后, 按 Ctrl - Shift - 输入编辑时,要显示这些内容,并将公式视为数组公式。出于这个原因,这些公式通常被称为 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:
如果你绝对不需要在对角线上方出现任何东西,制作一个下三角形块,那么你可以使用IF()
包裹上面的公式,检查列是否大于行并制作在这种情况下,单元格为空白。然后,您可以使用公式填充整个块,它看起来正确,无需删除。
{=IF(COLUMN(B2)>ROW(B2),"",AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0)))}