这个案例的场景是:我进行了一个问卷调研,其中题目Q2是一个多选题,一共有10选项,分别是Q2.1、Q2.2,…,Q2.10,由于录入人员在SPSS中录入时,选项被错误的录入,如下第1张图所示。录入人员依次从左至右,录入的是选项的序号值,而不是对应标题,用1表示选中,用0表示未选中,最终正确的录入结果应该是如下第2张图所示(这在SPSS中可以建立基于二分类的多重响应集,以便对多选题进行分析)。
由于样本行数很多,重新一行一行修改很不现实。现需要使用PQ将原始多选项的数据转换成上图的结果
操作实现:
= Table.Group(逆透视其他列, {"问卷号"}, {{"子表", (t)=> List.Generate( ()=>[ID=1,KEY="Q2."&Text.From(t{0}[值]),VALUE=1], each [ID]<=Table.RowCount(t), each [ID=[ID]+1,KEY="Q2."&Text.From(t{[ID]}[值]),VALUE=1], each _ ) }})
其中主要使用到了List.Generate,该函数我在另一篇博文按总期数为每期生成独立行数据(金融应用)中已经详细说明过,这里就不再多做说明,只是解释一下整个修改的部分的含义。
我使用List.Generate来生成一个每个元素都是Record的列表,每个Record都有三个键值对,ID,KEY,VALUE。ID是一个数字递增序号,KEY将会根据原来表中的值重新确定其对应的题号,例如假设值为4,那么它表示Q2.4这个选项被选中了,KEY就是Q2.4这个题号,而VALUE则是表示是否选中,1是选中,0是没选中,我们这里直接等于,因为在没选中情况下,原来的数据里面是空的,而PQ进行逆透视时,已经自动过滤掉了这些空值,所以一旦在子表列里的行,其中的值列必定不会为空。
此时我们会得到如下所示的结果,子表列中,每个元素都是一个List,List中则包含的是Record,可能会有多个Record也可能只有一个Record
= Table.Pivot(展开记录, List.Distinct(展开记录[KEY]), "KEY", "VALUE")
= Table.Pivot(展开记录, {"Q2.1", "Q2.2", "Q2.3", "Q2.4", "Q2.5", "Q2.6", "Q2.7", "Q2.8", "Q2.9", "Q2.10"}, "KEY", "VALUE")
原文:https://www.cnblogs.com/alexywt/p/13440796.html