EXCEL- 计算具有匹配组合的实例

EXCEL- Count instances that have matching combinations

我很擅长 excel 但由于某种原因找不到解决这个问题的正确方法(也许我把它复杂化了):

基本上我有 2 列信息如下:

Column 1    Column 2
A                  Red
A                  Blue
A                  Yellow
B                  Blue
B                  Green
B                  Brown
C                  Red
C                  Blue
C                  Brown

我想要的是创建一个 table 的交叉表类型,它计算第 1 列中有多少项在第 2 列中具有正确的值组合

例如,我希望得到以下结果:

         Red      Blue     Brown
Red   2            2            1

Red-Red 的计算结果为 2,因为第 1 列中有 2 个实例,其中项目在第 2 列中具有红色

Red-Blue 的计算结果为 2,因为有两种情况,其中 A 列中的值在第 2 列中同时具有红色和蓝色值(A-Red/A-Blue 和 C-Red/C-Blue)

Red-Brown 的计算结果为 1,因为 C 只是第 1 列中的值,而第 2 列中的值为 Red 和 Brown

我希望这很清楚。我已经尝试了 countifs/sumifs 的多种组合,但都没有得到想要的结果。 :(

您可以使用下面的解决方案,该解决方案使用帮助程序 table 计算您要查找的内容:

助手 table 上单元格 F12 的公式为:

=IF(COUNTIFS($B:$B,$E12,$C:$C,F)>0,1,0)

最终结果的公式table:

 =IF($E4<>F,SUMPRODUCT(INDEX($F:$J,0,MATCH($E4,$F:$J)),INDEX($F:$J,0,MATCH(F,$F:$J))),COUNTIF($C:$C,$E4))

注意:这是从类似问题中回收的答案,请参阅

Formula based approach

我的解决方案中单元格E2中的公式如下,因为它是一个数组公式你需要按Ctrl+Shift+Enter 使其工作。

{=SUM(--ISNUMBER(MATCH(IF((Column_1&$D2=Column_1&Column_2),Column_1)&E,Column_1&Column_2,0)))}

请注意,我已将一些示例数据添加到您的原始数据集中,并且我已命名以下范围:

Column_1代表第一列A的所有数据;

Column_2代表第二列B的所有数据。

我的逻辑是

  1. 使用IF函数和=求出,对于[=中的给定颜色79=]D列,Column_1中对应的值是多少?如果我们在单元格 D2 中查看 Red,我的 IF 函数将 return 以下内容 {"A";FALSE;FALSE;FALSE;FALSE;FALSE;"C";FALSE;FALSE;FALSE;"D";FALSE;FALSE;FALSE;FALSE};

  2. 使用 & 将上一步的范围与第 1 行中的查找值组合。如果我们将范围与 Red 在单元格 E1 中,我们将有 {"ARed";"FALSERed";"FALSERed";"FALSERed";"FALSERed";"FALSERed";"CRed";"FALSERed";"FALSERed";"FALSERed";"DRed";"FALSERed";"FALSERed";"FALSERed";"FALSERed"};

  3. 下一步是 MATCH 上一步的范围与给定组合 Column_1&Column_2 代表 ARed, ABlue, AYellow, BBlue, BGreen, 等等。继续我的示例,结果将是 {1;#N/A;#N/A;#N/A;#N/A;#N/A;7;#N/A;#N/A;#N/A;11;#N/A;#N/A;#N/A;#N/A}其中数值分别是ARedCRedDRed在给定组合Column_1&Column_2.

  4. 范围内
  5. 最后一步使用ISNUMBER找出上一步范围内有多少个值,即return {TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE} 然后 SUM 使用 --[ 将所有 TRUE 结果转换为数值 1 .

Power Query Based Approach

在我的解决方案 A1:B16 中使用相同的源数据,将其加载到 Power Query 编辑器,然后您应该具有以下内容:

请注意,我已按第 2 列 排序 table,然后按第 1 列连续升序排序。这是一个可选步骤,只是为了帮助使以下步骤更容易理解。

下一步是合并 table 通过匹配列 1:

展开新列以显示第 2 列:

突出显示最后一列,使用Pivot Column函数转换table,那么你应该有:

唯一的问题是颜色的位置与来源不同。

如果保持颜色的原始顺序很重要,一种方法是

  1. 创建一个 查找 table 索引列显示所需的颜色顺序;
  2. merge 在第一个查询中查找 table 数据透视列 之前,并匹配 第三列,对索引列展开排序后删除;
  3. 执行数据透视列,然后再次合并查找table,再次扩展、排序和删除索引列。

以下是幕后代码,仅供参考:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column 1", type text}, {"Column 2", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Column 2", Order.Ascending}, {"Column 1", Order.Ascending}}),
    #"Merged Queries" = Table.NestedJoin(#"Sorted Rows", {"Column 1"}, #"Sorted Rows", {"Column 1"}, "Filtered Rows", JoinKind.LeftOuter),
    #"Expanded Filtered Rows" = Table.ExpandTableColumn(#"Merged Queries", "Filtered Rows", {"Column 2"}, {"Filtered Rows.Column 2"}),
    #"Pivoted Column" = Table.Pivot(#"Expanded Filtered Rows", List.Distinct(#"Expanded Filtered Rows"[#"Filtered Rows.Column 2"]), "Filtered Rows.Column 2", "Column 1", List.Count)
in
    #"Pivoted Column"

如果您有任何问题,请告诉我。干杯:)

这是一个使用 Sum 和 Countifs 的版本(可能是 @AlexT82 想到的那种东西):

=SUM(COUNTIFS($A:$A,$A:$A,$B:$B,IF($B:$B=$D2,E)))

必须使用CtrlShiftEnter

输入

假设第 1 列中的每个项目的每种颜色只出现一次。

您应该能够通过除以它们在每个项目中出现的次数来纠正项目中的任何重复:

=SUM(IFERROR(COUNTIFS($A:$A,$A:$A,$B:$B,IF($B:$B=$D2,E))
/COUNTIFS($A:$A,$A:$A,$B:$B,$D2)/COUNTIFS($A:$A,$A:$A,$B:$B,E),0))