List.Mode/Modes

官方说明:

返回列表list中出现最多的项。如果列表为空,将引发异常。如果出现最多的项有多个,则选择其中的最后一项。可以指定可选的comparisonCriteria值equationCriteria来控制相等测试。
List.Mode(list as list, optional equationCriteria as any) as any

解读:

mode,即众数,返回列表中最多的项。
比如= List.Mode({"a","b","b","c"}),返回列表中最多的项即"b",很好理解。
如果出现最多的项有多个,则返回最后一项,比如= List.Mode({"a","b","b","c","c"})
虽然"b"和"c"都出现了2次,但因为"c"在"b"后面,所以返回最后一个即"c"。

第二参数为相等项测试,举几个例子:
现有一个班级考试成绩列表,问是80分及以上的多还是80以下的多?
= List.Mode({82,92,71,64,81,75,69},each _>=80)
首先对列表中的每一项通过第二参数比较器进行测试,返回了一个布尔值的列表。
比如82和92都是true,那么就认为这两个是相等的。
共有3个true和4个false,最多的是false,所以返回了第一次出现false的值即71,所以是80分以下的人多。

= List.Mode({"a","b","b","c","c","B"})
出现最多的最后一项为"c",但是如果加上第二参数,写成= List.Mode({"a","b","b","c","c","B"},Comparer.FromCulture("en-us", true)),第二参数比较器表示忽略大小写,那么"b"就出现了3次,返回"b"。

= List.Mode({[a=1,b=2],[a=3,b=4],[a=1,b=5]})
列表中有3个互不相等的record,出现次数都是1,那么返回最后一项[a=1,b=5]。
但是如果加上第二参数写成= List.Mode({[a=1,b=2],[a=3,b=4],[a=1,b=5]},each [a]),比较器选择只比较a,那么就会认为第1个和第3个是相等的,所以第1个出现次数就是2,就会返回[a=1,b=2]。

第二参数还有其他很多种形式,但由于语法非常复杂,且一般用不到,所以只作了解下就行,不必深挖。
如果出现最多的项有多个,你又不想只返回最后一个,而是想返回所有最多项的列表,那么就需要用到List.Modes,多个s,一字之差。比如:
= List.Modes({"a","b","b","c","c"}),返回{"b","c"}。

函数比较简单,常规的用法就不介绍了,最后再介绍一个非常规但又非常好用的案例:

以上为某行业从业人员城市分布数据及对应的柱状图,我们发现数据主要集中在北上广,其他城市的数据量很小,全部列出来的话图非常丑,于是要把非北上广的合并到"其他"类中。
常规的思维你可能会选择直接用if,但是如果数据非常多显然不科学,于是可以:
= Table.AddColumn(源, "自定义", each List.Mode({[城市]}&{"北京","上海","广州","其他"}))

将[城市]列的值加入到列表中,如果是北上广之一,那么最多出现的次数为2,返回北上广;如果非北上广,最多出现的次数为1,那么就返回最后的"其他"。

5 Replies to “List.Mode/Modes”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注