【问题标题】:EXCEL- Count instances that have matching combinationsEXCEL - 计算具有匹配组合的实例
【发布时间】:2019-08-14 19:15:26
【问题描述】:

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

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

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

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

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

         Red      Blue     Brown
Red   2            2            1

Red-Red 将评估为 2,因为第 1 列中有 2 个实例,其中项目在第 2 列中有红色

Red-Blue 的计算结果为 2,因为有两个实例,其中 A 列中的值在第 2 列中同时具有 Red 和 Blue 值(A-Red/A-Blue 和 C-Red/C-Blue)

Red-Brown 将评估为 1,因为 C 仅是第 1 列中的值,在第 2 列中具有 Red 和 Brown 的值

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

【问题讨论】:

标签: excel excel-formula array-formulas countif


【解决方案1】:

这是一个使用 Sum 和 Countifs 的版本(可能是 @AlexT82 正在考虑的那种东西):

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

必须使用 CtrlShiftEnter

输入

假设对于第 1 列中的每个项目,每种颜色仅出现一次。

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

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

【讨论】:

  • 从来不知道 COUNTIFS 可以以如此有趣的方式使用。谢谢!
【解决方案2】:

基于公式的方法

我的解决方案中E2单元格中的公式如下,由于是数组公式,需要按Ctrl+Shift+Enter让它发挥作用。

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

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

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

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

我的逻辑是

  1. 使用IF函数和=找出D列中给定的颜色对应的是什么Column_1 中的值?如果我们正在查看单元格D2 中的 Red,我的 IF 函数将返回以下内容 {"A";FALSE;FALSE;FALSE;FALSE;FALSE;"C";FALSE;FALSE;FALSE;"D";FALSE;FALSE;FALSE;FALSE};

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

  3. 下一步是 MATCH 使用给定的组合 Column_1&Column_2 代表 ARedABlue 的范围>、AYellowBBlueBGreen 等。继续我的示例,结果将是 {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. 最后一步使用 ISNUMBER 找出从上一步开始的范围内有多少个值是数字,应该返回 {TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE} 然后使用 -- 将所有 TRUE 结果SUM转换为数值1

基于 Power Query 的方法

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

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

下一步是通过匹配第 1 列,将表格与自己的表格合并

展开新列以显示第 2 列:

高亮最后一列,使用Pivot Column函数变换表格,那么你应该有:

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

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

  1. 创建一个查找表,用索引列显示所需的颜色顺序;
  2. 在第一个查询中合并这个查找表pivot column,并匹配第三列中的颜色,展开并排序索引列和然后删除它;
  3. 执行透视列,然后再次合并查找表,再次展开、排序和删除索引列。

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

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"

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

【讨论】:

  • 这个方法效果很好!!!唯一的缺点是因为我的数据集很大,计算时间很长。
  • @Capple 使用数组公式的缺点是它可能会减慢您对大型数据集的计算速度。确保仅在 A 列和 B 列中命名相关范围,而不是将整个 A:A 和 B:B 列命名为范围。不确定您是否愿意接受 Power Query 的解决方案?在电源查询编辑器中单击几下,您将很容易获得所需的结果。如果您有兴趣,请告诉我,我可以将其添加到我当前的解决方案中。在运行大量数据时,Power Query 在某些情况下速度更快,但需要对案例进行明智的测试。干杯:)
  • 是的,我绝对愿意接受电源查询解决方案。我经常使用它并在那里尝试了一些不同的方法,但没有达到预期的结果。截至目前,我的比较表大约有 19K 行,因此您可以想象通过数组方法计算所需的时间。
  • @Capple 我添加了电源查询解决方案希望它有意义。请让我知道在您的情况下使用电源查询是否比使用数组公式快得多。谢谢。
  • 我是我之前的尝试,唯一没有尝试过的是合并同一张表,但这是缺少的步骤和完美的解决方案。与使用阵列方法(从 2 小时到 2-3 分钟)相比,PQ 方法以闪电般的速度工作。太感谢了!我希望任何有同样问题的人都能找到这个帖子并节省自己的时间。
【解决方案3】:

您可以使用下面的解决方案,该解决方案使用一个帮助表来计算您要查找的内容:

辅助表中单元格 F12 的公式为:

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

以及最终结果表上的公式:

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

注意:这是一个类似问题的回收答案,请参阅original

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多