我知道这个问题以前已经问过,但我的问题需要更具可扩展性的解决方案!
我有一个列G
有各州的栏目,这个栏目里有 10,000 个州。
我需要找出最常见的状态。
通常的答案是: =INDEX($G:$G,MODE(MATCH($G:$G,$G:$G,0)))
但在我看来这是不可接受的,这意味着 Excel 需要在 10,000 个单元格中进行 10,000 次查找(100,000,000 次操作),这只是最好的情况(因为 Excel 不以找出正确使用的范围而闻名)。
因为我的列有一个州列表,所以我想我可以稍微修改一下这个公式
=INDEX($G:$G,MODE(MATCH(state_list,$G:$G,0)))
(其中 state_list 是一个州名称数组,这将产生 500,000 个操作,这是一个 200 倍的改进)。
然而,当我尝试计算这个时却出现#N/A
错误。
我使用 F9 来检查MATCH(state_list,$G:$G,0)
结果:{197,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A}
如果我错了请纠正我,这证明我正在使用数组公式?
如果是的话我做错了什么?
如何获得一种相对可扩展的方法来查找列中最常见的值(状态)G:G
谢谢
答案1
我还没有真正尝试过 10,000 行,但是尝试一下
=INDEX($S$1:$S$50, MATCH(MAX(COUNTIF($G$1:$G$10000,$S$1:$S$50)), COUNTIF($G$1:$G$10000,$S$1:$S$50), 0))
其中,唯一州值位于 中。(当然,这是一个数组公式;因此,输入时S1:S50
需要键入Ctrl++ 。)ShiftEnter
COUNTIF($G$1:$G$10000,$S$1:$S$50)
S1:S50
计算每个州 ( ) 在 Column 中出现的次数G
,从而生成一个包含 50 个数字的虚拟数组,这些数字的平均值为 200(因为它们的总和为 10,000)。请注意,此子表达式出现了两次,是的,在最坏的情况下,它需要 500,000 (50×10,000) 次比较 — 但平均而言,它只需要这个数字的一半。MAX(COUNTIF($G$1:$G$10000,$S$1:$S$50))
报告此虚拟数组中的最大数字。它将是一个 ≥ 200 的数字,表示最常出现的状态的频率(计数)。MATCH( max_value , array_of_counts, 0)
查找虚拟数组中最大值的位置。该数字介于 1 到 50 之间,表示最常出现的状态。INDEX($S$1:$S$50, state_number )
给出最常见的状态的名称。
答案2
您的公式失败了,因为您引用的是整个列,而不是特定范围。这自然会发现最常见的值为空。
您可以使用这个(极不稳定的)函数来解决这个问题 -
=INDEX(INDIRECT("G1:G"&COUNTA(G:G)),MODE(MATCH(INDIRECT("G1:G"&COUNTA(G:G)),INDIRECT("G1:G"&COUNTA(G:G)),0)))
我不推荐这个。
对于你提到的项目数量,我会使用数据透视表 -
选择您的列,插入-数据透视表
行可以是您的状态,值是它们的数数。您可以排序来查找最常见的。