通过数组筛选范围

28

我有一个包含欧洲杯2012年各支球队及其得分的谷歌电子表格:

Team     Points  Goals scored
------   ------  ------------
Germany    6          3
Croatia    3          3
Ireland    0          1
...       ...        ...

现在我想要筛选那个列表,使结果仅包含参与的球队子集。具体地,我希望结果列表仅包含以下球队:德国、荷兰、葡萄牙、意大利、英格兰、法国、西班牙克罗地亚

我知道我可以使用FILTER函数从表中提取单个值。因此,我可能可以编写像=FILTER(A2:C; A2:A = 'Germany' OR A2:A = 'Netherlands' OR A2:A = 'Portugal' OR ...)FILTER表达式,但我想避免这样做,因为球队列表有点动态。

所以问题是:如何按值的范围(而不仅仅是单个值)筛选表格?


请查看类似的问题:https://dev59.com/dmox5IYBdhLWcg3wkk-E - Guy
4个回答

69
对于那些像我一样偶然发现这个帖子并正在寻找答案的人,请查看这个Google产品论坛页面,在那里Yogi和ahab都提供了如何通过另一个数据范围来过滤数据范围的问题的解决方案。
如果A3:C包含要过滤的UEFA EURO 2012数据范围,并且D3:D包含要进行过滤的团队列表,则E3 ...
=FILTER(A3:C, MATCH(A3:A, D3:D,0))
或者
=FILTER(A3:C, COUNTIF(D3:D, A3:A))

筛选结果为正的过滤器

相反地,如果您想按未列在D3:D中的团队进行筛选,则使用E3...

=FILTER(A3:C, ISNA(MATCH(A3:A, D3:D,0)))
或者
=FILTER(A3:C, NOT(COUNTIF(D3:D, A3:A)))

负面过滤结果

这是一个示例电子表格,我制作了它来展示这些函数的有效性。


2
我想指出的是,您应该在答案中包含实际细节,因为链接经常会失效,这样答案在未来就不那么有用了。 - Douglas Gaskell
2
谢谢你,道格拉斯。你说得完全正确。我希望我的更新答案能够满足要求。 - Greg

5

如果您需要使用Greg的公式,但因FILTER的范围不匹配而感到困惑

=FILTER(A1:A, MATCH(A1:A, B1:B, 0))

=FILTER(A1:A, COUNTIF(B1:B, A1:A))

=FILTER(A1:A, ISNA(MATCH(A1:A, B1:B, 0)))

=FILTER(A1:A, NOT(COUNTIF(B1:B, A1:A)))

如果你想使用FILTER公式返回两个范围之间的比较,但这两个范围的大小不同(例如当它们从查询中返回时)且无法更改以匹配相同的大小,您可能会遇到“FILTER具有大小不匹配的范围。期望行数:等。”错误,那么这就是一种解决方法:

为了简单起见,假设您的过滤器范围为A1:A10B1:B8,则可以使用数组括号{}将两个虚拟行附加到范围B1:B8,以匹配大小A1:A10,方法是使用REPT计算所需重复次数的简单计算。

然后,对于这个REPT公式,我们需要添加+1作为校正/故障转移(在两个初始范围之间的差异为1的情况下),因为REPT最少需要重复2次。因此,在某种意义上,我们将需要创建一个B1:B11的范围(从B1:B8开始),然后稍后我们将仅从范围中修剪掉最后一行,使其成为B1:B10,以匹配A1:A10。我们将使用2个唯一的符号进行REPT

下一步是将REPT包装到SPLIT中,并通过第二个唯一的符号进行分割。然后,(基于进一步的需要)需要将此SPLIT包装到TRANSPOSE中(因为我们希望匹配列大小),最后一步是将其包装到QUERY并通过简单的数学计算COUNTA(A1:A10)再次限制输出,以裁剪掉最后一个重复项。组合起来看起来像这样:

=FILTER(A1:A10, NOT(COUNTIF(QUERY({B1:B8; 
 TRANSPOSE(SPLIT(REPT("♂♀", COUNTA(A1:A10)-COUNTA(B1:B8)+1), "♀"))}, 
 "limit "&COUNTA(A1:A10), 0), A1:A10)))


0
一些可能和不同的方法: =FILTER(C5:C;REGEXMATCH(C5:C;"one|two|five")) 结果:包含 one、two 或 five 的任何文本。区分大小写。 =FILTER(C5:C;REGEXMATCH(C5:C;JOIN("|";DC5:DC7))) 与上一个相同,但值在列表 DC5:DC7 中。 =FILTER(C5:C;REGEXMATCH(C5:C;"^("&JOIN("|";EE5:EE7)&")$")) 与上一个相同 + 匹配整个文本。

建议的早期选项:

=FILTER(C5:C;MATCH(C5:C;EG5:EG7;))

=FILTER(C5:C;countif(EK5:EK7;C5:C))

不区分大小写的结果。

同样不在列表中

=FILTER(C5:C;ISNA(MATCH(C5:C;EF5:EF7;)))

有趣的是:给出了列表之间的差异。


0

这是player0改进的答案,适用于需要使用不匹配表格大小的情况

该公式基于另一列中的列表过滤整个表格。我使用了一个lambda函数,所以您可以轻松地更改最后三个参数以检查是否适用于您。

第一个参数 - 要过滤的表格范围(或查询结果等)

第二个参数 - 过滤表格中要检查匹配列表的列号

第三个参数 - 指定列应包含的内容列表

=lambda(table_to_filter, no_of_col_to_filter_by, list_to_match, FILTER(table_to_filter, COUNTIF(QUERY({list_to_match; 
 TRANSPOSE(SPLIT(REPT("♂♀", COUNTA(index(table_to_filter,,no_of_col_to_filter_by))-COUNTA(list_to_match)+1), "♀"))}, 
 "limit "&COUNTA(index(table_to_filter,,no_of_col_to_filter_by)), 0), index(table_to_filter,,no_of_col_to_filter_by))))(A1:C8, 1, G1:G)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接