泉鸣知水急,云来觉山近。
本文节选自即将出版的新书
对于数据处理而言,M函数最大的改革就是数据扁平化。也就是通过丰富的M函数体系及结构化数据之间的转换,将我们接触的最频繁的表格,像庖丁解牛一样拆成记录、列表、值。
拆散后的数据可以再次按要求通过M函数转换,或者说“组装”。让数据处理就像“搭积木”一样,轻松自如。本文这个例子就很好的展示了M函数的灵活自如。
我们需要将左表转换成更加适合分析的一维表数据
一、加载分析数据
使用「自表格/区域」的方式,将数据加载到Power Query编辑器,在弹出的创建表对话框中,取消勾选表包含标题。
将加载到Power Query编辑器的数据分成三大部分,表的第一行和第二行代表着部门和标题两个部分,剩下的是表格内容。
数据表在Power Query中分为三大部分
二、获取关键信息
先通过表格的深化获取部门,部门在数据表的第0行,单击公式编辑栏的fx输入公式:= 源{0},返回的是包含部门信息的记录。为了更好的进行后续操作将它转换成列表,同时删除列表中的null值。
最终公式为:
= List.RemoveNulls(Record.ToList(源{0}))
获取部门信息
通过表格深化获取列标题,列标题在源数据表的第1行,直接获取的标题列是重复的,需要删除重复。
单击公式编辑栏输入公式:
= List.Distinct(Record.ToList(源{1}))
获取表格内容是此次任务中比较困难的部分。既然已经将部门及列名保存在两个列表中了,那么可以将表的前两行删除,使用Table.Skip()函数。
删除标题行
三、转换组合数据
此时表的内容是成对的出现,列1、列2是一组,列3、列4是一组,以此类推。
我们可以用Table.ToColumns()函数将删除标题后的表转换成列表,然后再用List.Split()将列表两两拆分。
将表格内容转换成列表
此时的三个列表中都保存着两个列表,而列表中的内容正是姓名、年龄的组合。使用Table.FromColumns()函数,将列表中每一个列表转换成表。
将列表转换成表
从预览中可以看到,列正确的组合在一起了,可是列名是默认的。
Table.FromColumns()函数第二个参数可以直接提供列名,前面的步骤列名可以直接作为它的第二个参数,修改M代码为:
=List.Transform(转换成列表,each Table.FromColumns(_, 列名))
预览中的列已经被正确命名了。
直接引用步骤作为参数
现在正确包含标题的数据表已经包含在列表中了,但是还缺少了部门信息。部门也是一个列表,一样地使用Table.FromColumns()函数将它们组合成表格即可。
添加部门信息
最后将数据展开就可以了。
百余篇优质原创文章练习文件;
365天不限次数答疑;
持续更新的杂志级图表制作方法及源文件;
历次分享的优秀可视化仪表板模板。
…………
领取专属 10元无门槛券
私享最新 技术干货