regroup

语法

regroup(X, label, func, [byRow=true])

参数

X 矩阵。

label 向量,表示用于分组计算的标签。当 byRow = true 时,label 的长度必须与矩阵行数相等,否则与矩阵列数相等。

func 单目聚合函数,可以是用户自定义聚合函数,也可以是内置函数。对具有相同标签的分组应用该函数进行聚合。

byRow 布尔值,默认值 true,表示按行聚合。若为 false,则表示按列聚合。

详情

按给定的行/列标签对矩阵进行分组聚合的操作。

数据表的分组聚合可以通过 SQL 的 group by 语句实现。而通过 regroup 函数,可以实现矩阵的分组聚合操作。

注意:建议参数 func 优先指定为系统内置的聚合函数,因为系统内部对内置函数进行了优化处理。(参考下例 2)

例子

例1:按行/列标签分组聚合

m = rand(20, 4:5)
m;
col1 col2 col3 col4 col5
11 6 6 10 4
6 7 5 2 16
2 16 14 19 9
17 6 13 10 2
# 按照列标签重组
label = `A`A`B`A`B
regroup(X=m, label=label, func=firstNot, byRow=false)
A B
11 6
6 5
2 14
17 13
# 按照行标签重组
label = 1 2 1 2
regroup(X=m, label=label, func=firstNot, byRow=true)
label col1 col2 col3 col4 col5
1 11 6 6 10 4
2 6 7 5 2 16

例2:内置函数和用户自定函数的性能对比

m = rand(1000.0, 10000)$100:100
defg my_avg(v):avg(v)

timer(1000) regroup(m, take(1 2 3 4 5, 100), avg)
# output
Time elapsed: 176.175 ms

timer(1000) regroup(m, take(1 2 3 4 5, 100), my_avg)
# output
Time elapsed: 1062.553 ms

例3:对面板数据进行分钟聚合

n=1000
timestamp = 09:00:00 + rand(10000, n).sort!()
id = take(`st1`st2`st3, n)
vol = 100 + rand(10.0, n)
vt = table(timestamp, id, vol)
m = exec vol from vt pivot by timestamp, id
regroup(m, minute(m.rowNames()), avg)