regroup

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)