Google Sheets:使用ARRAYFORMULA统计匹配查询字符串的行数异常问题
问题描述
我有一个包含文本列的input table,以及一个存储查询字符串的query table。需要为query table中的每一行,统计input table对应列中包含该行查询字符串的行数。
query table
| query | count |
|---|---|
| alpha | |
| bravo | |
| charlie delta |
input table
| query | data |
|---|---|
| this is my alpha | one |
| I will bravo you | two |
| what is your name | three |
| how are you | four |
| she, charlie delta, said | five |
| one two charlie three alpha | six |
预期输出
| query | count |
|---|---|
| alpha | 2 |
| bravo | 1 |
| charlie delta | 1 |
我尝试了以下公式,但返回结果所有行均为2,不符合预期,推测是仅统计了query table第一行的alpha:
=ARRAYFORMULA( IF( A2:A <> "", COUNTIF( REGEXMATCH(`input table`!A:A, A2:A), TRUE ), ) )
解决方案
错误原因
原公式中,COUNTIF无法处理数组形式的条件参数。当REGEXMATCH的第二个参数是数组(A2:A)时,COUNTIF只会取数组的第一个元素(即A2的alpha)作为统计条件,导致所有行都返回alpha的匹配次数2。
正确公式
方法1:使用BYROW(Google Sheets 新版本支持)
在query table的B2单元格输入:
=BYROW(A2:A, LAMBDA(q, IF(q="",,SUMPRODUCT(--REGEXMATCH('input table'!A:A, q)))))
BYROW遍历A2:A的每个查询词,LAMBDA定义对每个查询词的处理逻辑SUMPRODUCT(--REGEXMATCH(...))将匹配结果(布尔值)转为数字后求和,得到该查询词的总行数
方法2:使用MMULT(兼容性更强)
如果你的Google Sheets版本不支持BYROW,可以用矩阵乘法实现:
=ARRAYFORMULA(IF(A2:A="",,MMULT(--REGEXMATCH('input table'!A:A, TRANSPOSE(A2:A)), SEQUENCE(ROWS('input table'!A:A),1,1,0))))
TRANSPOSE(A2:A)将查询词转为列数组,和input table的文本列做全匹配得到二维布尔矩阵--将布尔值转为0/1,MMULT矩阵乘法计算每行的总和,即每个查询词的匹配次数
内容的提问来源于stack exchange,提问作者IMTheNachoMan
相关产品推荐
相关产品推荐

