regroup
New in version 1.30.20.
语法
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)
Time elapsed: 176.175 ms
$ timer(1000) regroup(m, take(1 2 3 4 5, 100), my_avg)
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)