Excel:确切找到两个相似列的匹配程度

时间:2015-06-16 15:21:57

标签: excel excel-formula

我想比较两个有些相似的列,看看它们究竟有多相似(重叠%)。我的网格大约是600x600,但这是一个简略的例子。

        100 101 102 103 104 105
   A    1   1   1   1   1   1
   B    1   1   1   1   1   1
   C    1   1   1   1   1   1
   D        1       1   1   1
   E            1   1   1   
   F                        1
   G                        
   TTL  3   4   4   5   5   5
       100% 75% 75% 80% 80% 80%

我们会说这些是汽车及其零件。网格中的区域是二进制是/否,1 /空白指示符。汽车#101和#102都有4个零件,但它们之间只有3个相同,所以它们被认为是75%相似。汽车#103和104完全相同,但在所有5部件汽车之间它们只有80%相似。

您如何使用大型数据集获取这些数字?可能有三十辆汽车" 600"零件"在它们中需要进行比较。除百分比外,我有所有数据。

3 个答案:

答案 0 :(得分:0)

这是一种可能的解决方案。创建两个命名范围: 1)模型 - 指的是包含数字100,101等的标题单元格

2)部分 - 包含数字A,B,...的数据左侧单元格的单列列。假设这是在包含1的

的网格的左侧

假设您有两个单元格,例如F15和G15,其中包含101或102之类的数字 在其他一些单元格中 - 输入以下公式:

=SUMPRODUCT(OFFSET(parts,0,MATCH(F15,models)),OFFSET(parts,0,MATCH(G15,models)))/SUM(OFFSET(parts,0,MATCH(G15,models)))

这应该计算由F15和G15中的值指定的两列中的行数,它们都是1,除以第二列中的1的数量。

答案 1 :(得分:0)

如果您对示例中的'TTL'之类的辅助行感到满意,请使用SUMIF:

=SUMIF(**TTLRange**, 3)

您只需将 TTLRange 替换为包含总计的单元格。

修改

您可以在每个现有列之后添加辅助列,使用示例中的数据,此列可以包含:

=IF(A1<>"", A1=C1, FALSE)

然后在另一个帮助行中,在TTL行下面添加以下内容:

=SUMPRODUCT((B1:B7=TRUE)*1)/C8

答案 2 :(得分:0)

本回答中的数据假设采用以下格式:

         A          B    C   D   E   F   G
    ---------------------------------------
 1|                 100 101 102 103 104 105
 2| A               1   1   1   1   1   1
 3| B               1   1   1   1   1   1
 4| C               1   1   1   1   1   1
 5| D                   1       1   1   1
 6| E                       1   1   1
 7| F                                   1
 8| G                   
 9| TTL             3   4   4   5   5   5
10| Similarity     100% 75% 75% 80% 80% 80%

这个答案涉及一些繁重的数学和矩阵操作。我将深入解释这一点,但首先是我使用的公式:

请注意,这是输入的数组公式: Ctrl + Shift + Enter

公式:

=SUM((MMULT((IF($B$9:$G$9=B9,$B$2:$G$8,($A$2:$A$8>0)*1)),TRANSPOSE(($B$9:$G$9>0)*1))=COUNTA($B$9:$G$9))*1)/B9

以下是步骤(这很长):

第1步

此步骤的目的是创建一个仅包含具有相同数量零件的汽车的矩阵。所有其他车型每个部件都有1个。该矩阵输入步骤#2。

为了解释这个步骤,我将使用汽车101和102,它们都有4个部件。使用汽车101和102,我们需要从原始数据创建这个矩阵:

1   1   1   1   1   1
1   1   1   1   1   1
1   1   1   1   1   1
1   1   0   1   1   1
1   0   1   1   1   1
1   0   0   1   1   1
1   0   0   1   1   1

除了汽车101和102没有的那部分之外,该矩阵包含每个部分的1。这是使用公式的内部IF语句实现的,但引用了部件101或102的C9或D9:

=IF($B$9:$G$9=C9,$B$2:$G$8,($A$2:$A$8>0)*1)
 or
=IF($B$9:$G$9=D9,$B$2:$G$8,($A$2:$A$8>0)*1)

这样做的方法首先是为IF语句创建一个true / false值数组:

$B$9:$G$9=D9 => {FALSE,TRUE,TRUE,FALSE,FALSE,FALSE}

使用它,它决定要查看$ B $ 2:$ G $ 8(对于真实情况)或($ A $ 2:$ A $ 8&gt; 0)* 1(对于错误情况)。查看$ B $ 2:$ G $ 8将返回正在查看的汽车的相应范围,在这种情况下,它将产生$C$2:$C$8$D$2:$D$8。对于所有错误情况,它将创建一个1的数组,其大小为A列中列出的部分数量。由于此示例有7个部分,因此对于每个错误情况,这将产生{1,1,1,1,1,1,1}。将所有这些放在一起会创建新的矩阵。

<小时/>

第2步

这一步我们需要为前一个矩阵中的每一行创建一个总和。要使用矩阵操作执行此操作,我们需要将该矩阵乘以每个汽车的1个数组(包括那些具有不同部件数量的汽车)。

继续我们的汽车101和102的例子,我们需要执行此操作:

1 + 1 + 1 + 1 + 1 + 1 = 6
1 + 1 + 1 + 1 + 1 + 1 = 6
1 + 1 + 1 + 1 + 1 + 1 = 6
1 + 1 + 0 + 1 + 1 + 1 = 5
1 + 0 + 1 + 1 + 1 + 1 = 5
1 + 0 + 0 + 1 + 1 + 1 = 4
1 + 0 + 0 + 1 + 1 + 1 = 4

这是通过矩阵乘法完成的:

 __                 __         _   _
|1   1   1   1   1   1|       |  1  |     1x1 + 1x1 + 1x1 + 1x1 + 1x1 + 1x1 = 6
|1   1   1   1   1   1|       |  1  |     1x1 + 1x1 + 1x1 + 1x1 + 1x1 + 1x1 = 6
|1   1   1   1   1   1|       |  1  |     1x1 + 1x1 + 1x1 + 1x1 + 1x1 + 1x1 = 6
|1   1   0   1   1   1|   X   |  1  | =>  1x1 + 1x1 + 0x1 + 1x1 + 1x1 + 1x1 = 5
|1   0   1   1   1   1|       |  1  |     1x1 + 0x1 + 1x1 + 1x1 + 1x1 + 1x1 = 5
|1   0   0   1   1   1|       |  1  |     1x1 + 0x1 + 0x1 + 1x1 + 1x1 + 1x1 = 4
|1   0   0   1   1   1|        ‾   ‾      1x1 + 0x1 + 0x1 + 1x1 + 1x1 + 1x1 = 4
 ‾‾                 ‾‾            

由于我们已经有了第一个矩阵,要创建1列的单列,我们需要查看我们拥有的汽车数量。这可以通过参考汽车#范围或TTL范围(只要从未有任何0部件的汽车)轻松完成。我在这个例子中使用了TTL。只需拨打($ B $ 9:$ G $ 9&gt; 0)* 1即可获得{1,1,1,1,1,1}这是一个。然后用TRANSPOSE包裹它,使其成为一个。然后使用MMULT乘以两者:

MMULT((IF($B$9:$G$9=B9,$B$2:$G$8,($A$2:$A$8>0)*1)),TRANSPOSE(($B$9:$G$9>0)*1))

<小时/>

第3步

现在它开始变得相当直接。我们只需要计算单列矩阵中的多少值等于最大汽车数量。要获得汽车数量,您可以在TTL行:或汽车#行上对此进行硬编码或仅COUNTA。我再次使用TTL:

COUNTA($B$9:$G$9)

只需在SUM中使用此条件(将其乘以1得到1&#39; s和0&#39; s)即可获得总计数:

SUM((MMULT(...)=COUNTA($B$9:$G$9))*1)

在这个看起来如下的续例:

6 =? 6 => 1
6 =? 6 => 1
6 =? 6 => 1
5 =? 6 => 0
5 =? 6 => 0
4 =? 6 => 0
4 =? 6 => 0
   SUM =  3

<小时/>

第4步

最后也是最简单的:将此计数除以该车的零件数量(TTL)以获得百分比。

SUM((MMULT(...)=COUNTA($B$9:$G$9))*1)/B9 = (3 / 4) = 0.75 => 75%

为清晰起见,这是最后的截图:

Final Output

您当然需要根据您的数据更新范围。

要添加更多汽车,请更改所有水平范围:

=SUM((MMULT((IF($B$9:$G$9=B9,$B$2:$G$8,($A$2:$A$8>0)*1)),TRANSPOSE(($B$9:$G$9>0)*1))=COUNTA($B$9:$G$9))*1)/B9
                ^^^^^^^^^    ^^   ^^                                ^^^^^^^^^                ^^   ^^

要添加更多零件,请更改所有垂直范围:

=SUM((MMULT((IF($B$9:$G$9=B9,$B$2:$G$8,($A$2:$A$8>0)*1)),TRANSPOSE(($B$9:$G$9>0)*1))=COUNTA($B$9:$G$9))*1)/B9
                  ^^   ^^  ^        ^^       ^^^^                     ^^   ^^                 ^^   ^^       ^