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)