4. 逆转置与按指定顺序排序
使用上一题中得到的 EmpBirthday.xlsx 数据,(1)将结果转回按月份和日期排序的行式报表。(2)计算二月、五月和八月出生的总人数,在表中按顺序列出。
参考答案:
解答:
A | |
---|---|
1 | =file(“EmpBirthday.xlsx”).xlsimport@t(“Daily Statistics”) |
2 | =A1.pivot@r(Day;Month,Count) |
3 | =12.(string(date(2024,~,1),“MMM”)) |
4 | =A2.align@a(A3,Month) |
5 | =A4.conj() |
6 | =A5.new(Month,Day,Count) |
7 | [Feb,May,Aug] |
8 | =A6.groups(Month;sum(Count):Count).align(A7,Month) |
读取 Excel 文件时,需要用 f.xlsimport(s) 函数,这里需要将首行作为序表列名,添加了 @t 选项,在文件中只有一个页面时,也可以不知道 sheet 的名称。A1 也可以改为 =T(“EmpBirthday.xlsx”;“Daily Statistics”),使用 T 函数时会根据扩展名自动识别文件。读取到的交叉表结果如下:
在 A2 中用 pivot@r 函数将其做逆转置,保持 Day 字段,并将其它字段转换为 Month 字段,而交叉表中的值转换为 Count 字段的值,执行后 A2 中结果如下:
此时的结果与我们需要的序表差别比较大,首先是字段位置不匹配,因此需要重新生成;其次则是记录的顺序是先按日期再按月份排序的,这和我们所需要的不同。但是,需要注意的是,此时月份的排序不能简单按值去排,否则会按字母顺序排列,得到 Apr, Aug,Dec…这样的结果。为此,仍然需要准备 1 月至 12 月所对应的缩写序列,A3 中结果如下:
在 A4 中,可以用 A.align@a() 根据 A3 中的数据将每个月的记录去分组,结果如下:
A5 中,用 A.conj() 函数,将这些分组中的记录依次连接在一起,结果如下:
A6 中则可以用 A.new() 函数按所需的列顺序生成结果序表。
除了这种方法,也可以在调整 A2 中记录的顺序时,使用 =A2.sort(A3.pos(Month)) 去得到与 A5 中相同的结果,相当于先找到月份对应的数值再排序。
A8 先用 A6 中的结果统计出每个月出生的总人数,再按要求选出所需 3 个月的数据并按顺序用 A.align() 对齐排序。
英文版