如何在 Google 工作表中执行 SUMPRODUCT,但以两个向量中的文本为条件?
How do I do a SUMPRODUCT in Google Sheets, but conditional on the text in both vectors?
以下电子表格显示了 4 名学生的练习提交状态。有 4 个练习(1-4),但其中只有 2 个是家庭作业(因此评分)——它们的名称中有一个前缀 'H'。正确的提交被标记为“完成”。
我正在计算,对于每个学生,他有多少“完整”的提交,这也是家庭作业。最右边一列是我想要的结果。
各种countifs都试过了,就是搞不定。我有一个使用 SUMPRODUCT 的丑陋解决方案,但这需要将所有“完整”替换为 1(我宁愿不要)+ 一些。我更喜欢 Google 表格解决方案,但 excel 也可以...
有心帮老师:-)
我建议使用 mmult,这是从矩阵中获取行总计的标准方法。正如您提到的,第一步是将每个包含“完整”的单元格转换为 1,然后检查 headers 是否存在字母 H。
=ArrayFormula(mmult((A2:D6="complete")*(isnumber(SEARCH("h",A1:D1))),transpose(column(A2:D6))^0))
我已经在 Google 表格中对此进行了测试,但它也应该在 Excel 中工作。
编辑
(1) 使范围适应变化的最简单方法是对列数设置一些上限并使引用 full-column,例如
=ArrayFormula(if(A2:A="","",mmult((A2:M="complete")*(isnumber(SEARCH("h",A1:M1))),transpose(column(A2:M))^0)))
您可能希望将总数移到另一个 sheet:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)))
(2) 要获取百分比值,您可以使用 countif:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/countif(Sheet7!A1:Z1,"*h*")))
并将列格式设置为百分比。
编辑 2
要检查 headers 中是否存在 H 但忽略 h,请使用 Find 而不是 Search,并使用 regexmatch 而不是 countif:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(find("H",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/sum(--regexmatch(""&Sheet7!A1:Z1,"H"))))
如果您只想包含 headers _starting_with H,请将正则表达式匹配中的“H”更改为 @player0 的回答中的“^H”。
如果 H
列的位置是已知的,你可以做简单的:
=INDEX(IF(A2:A="",,ADD(D2:D="complete", E2:E="complete")))
如果 H 的列数和位置未知:
=INDEX(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
*(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")),
ROW(INDIRECT("A1:"&COLUMN()-1))^0))
更新:
=INDEX(TEXT(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
*(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")),
ROW(INDIRECT("A1:"&COLUMN()-1))^0)/
SUM(1*REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")), "0.00%"))
以下电子表格显示了 4 名学生的练习提交状态。有 4 个练习(1-4),但其中只有 2 个是家庭作业(因此评分)——它们的名称中有一个前缀 'H'。正确的提交被标记为“完成”。
我正在计算,对于每个学生,他有多少“完整”的提交,这也是家庭作业。最右边一列是我想要的结果。
各种countifs都试过了,就是搞不定。我有一个使用 SUMPRODUCT 的丑陋解决方案,但这需要将所有“完整”替换为 1(我宁愿不要)+ 一些。我更喜欢 Google 表格解决方案,但 excel 也可以...
有心帮老师:-)
我建议使用 mmult,这是从矩阵中获取行总计的标准方法。正如您提到的,第一步是将每个包含“完整”的单元格转换为 1,然后检查 headers 是否存在字母 H。
=ArrayFormula(mmult((A2:D6="complete")*(isnumber(SEARCH("h",A1:D1))),transpose(column(A2:D6))^0))
我已经在 Google 表格中对此进行了测试,但它也应该在 Excel 中工作。
编辑
(1) 使范围适应变化的最简单方法是对列数设置一些上限并使引用 full-column,例如
=ArrayFormula(if(A2:A="","",mmult((A2:M="complete")*(isnumber(SEARCH("h",A1:M1))),transpose(column(A2:M))^0)))
您可能希望将总数移到另一个 sheet:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)))
(2) 要获取百分比值,您可以使用 countif:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/countif(Sheet7!A1:Z1,"*h*")))
并将列格式设置为百分比。
编辑 2
要检查 headers 中是否存在 H 但忽略 h,请使用 Find 而不是 Search,并使用 regexmatch 而不是 countif:
=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(find("H",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/sum(--regexmatch(""&Sheet7!A1:Z1,"H"))))
如果您只想包含 headers _starting_with H,请将正则表达式匹配中的“H”更改为 @player0 的回答中的“^H”。
如果 H
列的位置是已知的,你可以做简单的:
=INDEX(IF(A2:A="",,ADD(D2:D="complete", E2:E="complete")))
如果 H 的列数和位置未知:
=INDEX(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
*(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")),
ROW(INDIRECT("A1:"&COLUMN()-1))^0))
更新:
=INDEX(TEXT(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
*(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")),
ROW(INDIRECT("A1:"&COLUMN()-1))^0)/
SUM(1*REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")), "0.00%"))