我想比较两个有些相似的列,看看它们究竟有多相似(重叠%)。我的网格大约是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"零件"在它们中需要进行比较。除百分比外,我有所有数据。
答案 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个。该矩阵输入步骤#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}
。将所有这些放在一起会创建新的矩阵。
这一步我们需要为前一个矩阵中的每一行创建一个总和。要使用矩阵操作执行此操作,我们需要将该矩阵乘以每个汽车的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))
<小时/>
现在它开始变得相当直接。我们只需要计算单列矩阵中的多少值等于最大汽车数量。要获得汽车数量,您可以在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
<小时/>
最后也是最简单的:将此计数除以该车的零件数量(TTL)以获得百分比。
SUM((MMULT(...)=COUNTA($B$9:$G$9))*1)/B9 = (3 / 4) = 0.75 => 75%
为清晰起见,这是最后的截图:
您当然需要根据您的数据更新范围。
要添加更多汽车,请更改所有水平范围:
=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
^^ ^^ ^ ^^ ^^^^ ^^ ^^ ^^ ^^ ^