二维矩阵上的 Sumproduct 或 Countif
Sumproduct or Countif on a 2D matrix
我正在处理过敏人群的数据。每个人都有一个唯一的ExceptionID,每个过敏原都有一个唯一的AllergenID(共451个)。
我有一个包含 2 列(ExceptionID 和 AllergenID)的数据 table,其中逐行列出每个人的过敏症。这意味着 ExceptionID 列对患有多种过敏症的人具有重复值,而 AllergenID 列对具有该过敏症的不同人具有重复值。
我正在尝试计算此人群中每对过敏症出现的次数(例如 Allergen#107 和 Allergen#108、Allergen#107 和 Allergen#109 等)。为了简单起见,我创建了一个 451 行 X 451 列的矩阵,代表每一对(实际上是两次,因为 A/B 和 B/A 是等价的)。
我不知何故需要使用行名称 (allergenID) 来查找我的数据中的 ExceptionID table,并计算与列名称(也是 AllergenID)中的 ExceptionID 匹配的情况。我在使用 Vlookup 或 Index/Match 时没有问题,但我正在为查找和 Sumproduct 或 Countif 公式的正确组合而苦苦挣扎。
非常感谢任何帮助!
迈克
PS 如果有任何变化,我正在使用 Excel 2016。
-=更新=-
因此,Dirk 和 MacroMarc 建议的方法都有效,尽管我无法将后者应用于我的完整数据集(17,000 多行),因为它需要很长时间。
我已经决定将它变成一个 VBA 宏,因为我们现在想要查看三胞胎的数量而不是成对的数量。
从您开始的 2 列开始,这几乎是不可能的...您需要检查每个 ExceptionID 是否有 2 个不同的特定 AllergenID。最好使用 helper-table ,将 ExceptionID 作为行,将 AllergenID 作为列(或相反......随你喜欢)。助手 table 需要这样的公式:
=COUNTIFS($A:$A,$D2,$B:$B,E)
然后可以自动填充。 (范围来自我的示例,您需要根据需要更改它们)。
有了这个辅助矩阵,您可以像这样轻松地获得更大的矩阵:
=COUNTIFS(E:E,1,INDEX($E:$G,,MATCH($I2,$E:$G,0)),1)
同样,您可以使用此公式自动填充,但您需要对其进行更改,以使其符合您的需要。
因为这些列具有相同的 ID2(将是您的 AllergenID),所以无需查找它们,因为 E:E
会随着自动填充自动更改。
公式中最重要的部分是$
,不能弄乱,否则不能自动填写。
我自制的例子的图片(公式来自每个table左上角的单元格):
如果还有什么问题,尽管问:)
可以使用数组公式直接从您的原始设置中完成:
请注意,在上下复制之前,必须使用 Ctrl-Shift-Enter 输入数组公式:
在示例图片中,我将数据范围 $A$2:$A$21 命名为 'People' 并将 $B$2:$B$21 命名为 'Allergens' 以使其成为更好的集合-向上。您可以在公式栏中看到它作为公式的样子。但是,您可以在第一个矩阵单元格中使用这样的标准引用:
编辑: 愚蠢的我,将布尔值转换为 1 和 0 不需要 N 函数,因为乘以布尔值就可以了。以下公式有效...
SUM(IF(MATCH($A:$A,$A:$A,0)=ROW($A:$A)-1, NOT(ISERROR(MATCH($A:$A&$E2,$A:$A&$B:$B,0)))*NOT(ISERROR(MATCH($A:$A&F, $A:$A&$B:$B,0))), 0))
然后从F2上下复制。它也许可以通过 sumproduct 或其他任何技术在技术上得到改进,但这只是该技术的一个粗略示例....
我正在处理过敏人群的数据。每个人都有一个唯一的ExceptionID,每个过敏原都有一个唯一的AllergenID(共451个)。
我有一个包含 2 列(ExceptionID 和 AllergenID)的数据 table,其中逐行列出每个人的过敏症。这意味着 ExceptionID 列对患有多种过敏症的人具有重复值,而 AllergenID 列对具有该过敏症的不同人具有重复值。
我正在尝试计算此人群中每对过敏症出现的次数(例如 Allergen#107 和 Allergen#108、Allergen#107 和 Allergen#109 等)。为了简单起见,我创建了一个 451 行 X 451 列的矩阵,代表每一对(实际上是两次,因为 A/B 和 B/A 是等价的)。
我不知何故需要使用行名称 (allergenID) 来查找我的数据中的 ExceptionID table,并计算与列名称(也是 AllergenID)中的 ExceptionID 匹配的情况。我在使用 Vlookup 或 Index/Match 时没有问题,但我正在为查找和 Sumproduct 或 Countif 公式的正确组合而苦苦挣扎。
非常感谢任何帮助!
迈克 PS 如果有任何变化,我正在使用 Excel 2016。
-=更新=- 因此,Dirk 和 MacroMarc 建议的方法都有效,尽管我无法将后者应用于我的完整数据集(17,000 多行),因为它需要很长时间。
我已经决定将它变成一个 VBA 宏,因为我们现在想要查看三胞胎的数量而不是成对的数量。
从您开始的 2 列开始,这几乎是不可能的...您需要检查每个 ExceptionID 是否有 2 个不同的特定 AllergenID。最好使用 helper-table ,将 ExceptionID 作为行,将 AllergenID 作为列(或相反......随你喜欢)。助手 table 需要这样的公式:
=COUNTIFS($A:$A,$D2,$B:$B,E)
然后可以自动填充。 (范围来自我的示例,您需要根据需要更改它们)。
有了这个辅助矩阵,您可以像这样轻松地获得更大的矩阵:
=COUNTIFS(E:E,1,INDEX($E:$G,,MATCH($I2,$E:$G,0)),1)
同样,您可以使用此公式自动填充,但您需要对其进行更改,以使其符合您的需要。
因为这些列具有相同的 ID2(将是您的 AllergenID),所以无需查找它们,因为 E:E
会随着自动填充自动更改。
公式中最重要的部分是$
,不能弄乱,否则不能自动填写。
我自制的例子的图片(公式来自每个table左上角的单元格):
如果还有什么问题,尽管问:)
可以使用数组公式直接从您的原始设置中完成:
请注意,在上下复制之前,必须使用 Ctrl-Shift-Enter 输入数组公式:
在示例图片中,我将数据范围 $A$2:$A$21 命名为 'People' 并将 $B$2:$B$21 命名为 'Allergens' 以使其成为更好的集合-向上。您可以在公式栏中看到它作为公式的样子。但是,您可以在第一个矩阵单元格中使用这样的标准引用:
编辑: 愚蠢的我,将布尔值转换为 1 和 0 不需要 N 函数,因为乘以布尔值就可以了。以下公式有效...
SUM(IF(MATCH($A:$A,$A:$A,0)=ROW($A:$A)-1, NOT(ISERROR(MATCH($A:$A&$E2,$A:$A&$B:$B,0)))*NOT(ISERROR(MATCH($A:$A&F, $A:$A&$B:$B,0))), 0))
然后从F2上下复制。它也许可以通过 sumproduct 或其他任何技术在技术上得到改进,但这只是该技术的一个粗略示例....