1

我想创建一个公式,该公式将从数据表中创建一个相似度矩阵。以下是所需输出后跟数据的示例。数据行表示模块化类算法的结果。我需要我的输出来计算两个国家共享相同类值的月数(可以是任何值,只要它们相等)除以总月数。

输入模块化类

        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,但我不知道什么是最合适的。

4

2 回答 2

2

我将提供一个正确的方向,而不是整个解决方案。我认为您将能够从给定的公式中概括出解决方案。

我将您的输入矩阵放在 A1:F6 中。然后我建立了一个中间矩阵。A9 只是“第 1 列中的匹配项”。

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

然后我将月份名称 jan .. may 复制到 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,你会得到每个国家和它的邻国之间的差异。我的矩阵原来是:

    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。

于 2013-10-21T14:56:19.147 回答
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-Enter以使它们出现并将公式视为数组公式。出于这个原因,这些公式通常称为CSE 公式(Ctrl-Shift-Enter)。

更新:

你可以用一个公式来完成,填充单元格,也可以使用INDIRECT()and 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)))}
于 2013-10-21T15:20:29.657 回答