前段时间,有朋友在群里问,Power Query最难的函数是什么?有的说是List.Accumulate,有的说是List.Generate……
而我说,最难的是each!
严格来说,each并不算是一个函数,而只是一个关键字,但是,毕竟它就是跟函数黏在一起,是M的最重要部分之一。
所以,我们在说函数的时候,不应该把它孤立地看,而它——更关键的是它的背后的变量(x)及自定义函数,才是绝大多数朋友学习Power Query及M的真正拦路虎!算是M里最难的问题了,没有之一!
在开始之前,先给大家打个预防针:对于这个问题,不大可能通过一两个例子就完全理解,又或者理解了就马上用得得心应手。更多的情况是,通过不同的例子,然后反复回头对自己已经搞懂的例子进行琢磨,才可能真正把它理解透。
同时,大家对这个重难知识点,有什么疑问,欢迎留言,我将整理作答,并继续写成文章或录制视频,一篇写不清楚就写两篇,两篇写不完就写三篇……务求为大家清除这个学习上的拦路虎!
今天,我先通过多个简单案例,让大家先了解each _和它背后的(x)的基础知识!
首先,each _ 是Power Query里为了简化自定义函数写法,而默认用来表示当前计算环境中的当前元素的一个特殊组合,没有为什么,就是这么规定的,你只需要记住这个规则,并慢慢理解它即可。
比如说,我们对一个表添加一个自定义列,公式写 = _ ,表中将新增一列,这一列里每个值,就是当前行的信息:
同时,我们看这个步骤生成公式为:Table.AddColumn(源,”自定义”, each _ ) ,也就是说,Power Query自动给 _ 加上了 each,实现了取当前行的功能。
写到这里,如果你一时没理解,也没有关系,先记住这种情况,继续往下看后面的变化,然后再回头看上面这句话的意思,慢慢就会理解。
接下来我们看第1种等价的写法:我们将其中的each _ 改为 (_)=>_:
会得到完全一样的结果。而这里(_)=>_就是一个简单的自定义函数,即设置一个名称为 _ 的变量代表某项内容传输进后面的公式进行处理(这里是直接返回这项内容 = _)。
也就是说,each _ 就是 自定义函数 (_)=>_ 的一个简化形式。
然后,既然能用 _ 作为变量名称,那当然也应该可以用其他字母或符号来代替,比如,x,y……所以,我们还可以将上面的步骤公式的 (_)=>_ 修改为 (x)=>x ,也得到同样的结果:
而这就是我们经常看到而又不理解的通用性写法。前面的 each _ 只是Power Query用来简化自定义函数的一个特殊写法,知道是怎么回事,或当在看到通过操作生成的步骤里出现each的时候,理解它的由来即可,自己写公式或自定义函数的时候,尽量用(x)=>的通用写法。
明白了each _是(x)=>x的特殊表达形式,each _就可以先放一边了,接下来我们的关键就是要理解(x)=>到底是怎么回事,而这之所以是Power Query里最难的点,是因为:这里的变量所代表的数据,是随着不同的函数变化的,同时,针对这个变量要做什么样的操作,则要看函数需要得到什么样的结果来灵活处理的。
在上面的例子里,(x)代表的是“源”表的当前行,而再换一个函数,它所代表的内容可能完全不同,比如下面的例子:
这里面,x代表的是列表 {1..10}中的当前项。
但是,无论x代表的是一个表的行也好,还是一个列表的一项也好,它有一个统一的含义,就是代表这个函数要操作的内容的当前项。比如Table.AddColumn,是针对“源”表一行行进行操作;List.Select则是针对列表一项项进行操作。
然后再说返回内容的问题:
比如Table.AddColumn函数,要返回当前行的内容,所以使用(x)=>x;而对于List.Select函数,则是要根据后面返回的判断条件(>3)是否成立来进行数据的筛选,所以使用(x)=>x>3。
所以,对于(x)的理解,最关键的是首先要知道它在一个函数中,到底代表的当前项是什么内容,这里先给大家讲两类最常用函数的普遍规律,后面再给大家讲特殊的情况:
1、对于表函数Table.XXXXX,大多数情况下,都是指函数操作的表一行行;
比如除了上面的Table.AddColumn,还有常用的Table.SelectRows,筛选出姓名为大海的数据,就是针对表的一行行进行判断,看它的姓名是不是大海:(x)=>x[姓名]=”大海”
2、对于列表函数 List.XXXXX,大多数情况下,都是指函数操作的列表的一项项。
比如,除了上面的List.Select,我们再看看常用的List.Tranform,对它操作的列表(1~10)的每个数据*10,x*10就是代表对它的一项项乘于10。
至此,通过上面的多个简单例子,把(x)=>的普遍含义基本讲完,大家可以多结合各函数先进行理解。后面我再通过更多更复杂的案例(如List.Accumulate、List.Generate、Table.Group、Table.ReplaceValue等)进行更深入讲解。
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!