7. 归并计算
文件 meteorolog.txt 存储了一些观测站在 2023 年的气象数据;文件 meteorolog2022.txt 中,存储了这些观测站在 2022 年的气象数据。(1)请根据这些数据,获得两年的所有观测数据,并且将月和日相同的数据相邻。(2)在两年中,哪些观测站记录的总降水量(PRCP)均位于前 10 名。(3)在两年的数据中,统计最高的 8 次气温记录(包括名次相同的情况),将按每个观测站一行列出,单个观测站可能有多次记录,要求展示每次观测的日期、最高气温和当年排名,列名为 Date1,Max1,Rank1,Date2,Max2,Rank2,…
参考答案:
解答:
A | |
---|---|
1 | =T(“meteorolog2022.txt”) |
2 | =T(“meteorolog.txt”) |
3 | =[A1,A2].merge(month(DATE), day(DATE)) |
4 | =A1.groups(STATION;round(sum(PRCP),2):TOTALPRCP).top(-10,TOTALPRCP,~) |
5 | =A2.groups(STATION;round(sum(PRCP),2):TOTALPRCP).top(-10,TOTALPRCP,~) |
6 | =[A4,A5].merge@oi(STATION) |
7 | =A3.top@r(-8;MAX) |
8 | =A7.(MAX) |
9 | =A7.derive(rank@r(MAX,A8):Rank) |
10 | =A9.groupc(STATION;DATE,MAX,Rank;${8.([“Date”/~,“Max”/~,“Rank”/~].concat@c()).concat@c()}) |
A1 和 A2 分别从文件中读取数据。由于两年的数据均是按日期排序的,因此 A3 中根据月份和日期执行 merge 后,在相同的日期内,将中从两个序表中轮流获取记录。
A4 和 A5 计算每年中,哪些观测站的全年降水量排在前 10 名,由于求的是最大的 10 名,因此参数中使用 -10,这种使用和在 TOTALPRCP 前加负号的效果是相同的。以 A4 中的数据为例,结果如下:
A6 将 A4 和 A5 中的结果归并,并添加 @i 选项求 STATION 的交集。另外由于 A4 和 A5 中的结果是按照降水量排序的而不是站名,因此还需要添加 @o 选项在归并前排序。如果只是需要获得 STATION 的结果序列,也可以分别在 A4 和 A5 中计算后再做序列的交集计算,即将 A6 中表达式改为 =A4.(STATION)^A5.(STATION)。
A7 用 A.top() 函数获取最高温度的前 8 名记录,由于要求包括名次相同的记录,因此需要添加 @r 选项。在 A8 从 A7 结果中取出最高温度,准备用来计算排名。A9 中根据前 8 名最高温度的记录准备所需数据,包括站名、日期、最高温度,并且计算出排名,A9 中结果如下,可以看到因为存在排名相同的情况,因此得到的数据不止 8 条:
A10 使用 P.groupc(g,…;F,…;N,…) 函数,对结果序表进行多列的行列转换处理,本题中用 STATION 分组,列出每组中的 DATE,MAX 和 Rank 数据用多栏展开,而新的字段名用宏 ${} 计算,这里准备了 8 组 Daten,Maxn,Rankn 的新字段名,从前面的结果中能够看到,实际归根据站点最多的分栏数计算,多余的新字段名并不会用到。
英文版