excel公式如何构build相似matrix

我想创build一个公式,从数据表中创build一个相似性matrix。 以下是所需输出后面的数据示例。 数据行表示模块化类algorithm的结果。 我需要我的输出来计算两个国家共享相同类别价值的月数(只要它们相等,可以是任意值)除以总月数。

input模块化类

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 

输出相似度matrix

  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()处理过的单元格的数量,得到您的相似度索引。

上面的例子是在你的例子中的美国/美国的顶部单元格,你可以用这个填充,但是每个新的对angular线需要调整以将固定的行号改变到新的行。 所以英国专栏的顶部将是:

 {=SUM(IF($B$3:$F$3=$B3:$F3,1,0))/COUNT($B$3:$F$3)} 

使用数组公式的条件和

如果您知道有多less列/国家, COUNT()可以被删除。

注意:不要input大括号。 input完公式后,您必须在编辑时按下CtrlShiftEnter键 ,才能显示这些公式,并将公式视为数组公式。 这些公式通常被称为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:

如果你绝望地不需要出现在对angular线的上方,做一个下三angular块,那么你可以使用IF()包装上述公式,检查列是否大于行,并使单元格为空案件。 然后你可以用公式填充整个块,它看起来是正确的,不需要删除。

 {=IF(COLUMN(B2)>ROW(B2),"",AVERAGE(IF(INDIRECT("$B$"&COLUMN(B2)):INDIRECT("$F$"&COLUMN(B2))=$B2:$F2,1,0)))} 

我将提供一个正确的方向,而不是整个解决scheme。 我想你可以从给出的公式推广解决scheme。

我把你的inputmatrix放在A1:F6中。 然后我build立了一个中间matrix。 A9简单地说就是“匹配第1列”。

===编辑:在列===中使用月份名称

然后我把B10:F10中的月份名称复制一份。 也是美国.. EG在A11 .. A15。

然后在B12,乐趣开始。 我把一个公式, =IF(B3=B2,1,0) 。 如果B3 = B2,则它在单元格中放置1,否则为0。 然后,我从B12到F12填写正确的,然后计算出以下行:

 1 0 1 0 1 

你会注意到这是英国=美国的几个月。

如果你拿B12填充到B15,然后填写B12 .. B15到F15,你会得到每个国家和邻国的区别。 我的matrix结果是:

  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。 这些对应于第一列的输出matrix,即0.6,0.6,0,0。