---
source_url: https://docs.dolphindb.cn/zh/funcs/r/regroup.html
fetched_at: 2026-05-19T09:35:36Z
category: funcs
title: regroup
sha1: 9a0f0cdf06a7d0ea9db1304da204bcad09507da1
---

# regroup

## 语法

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

## 详情

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

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

注意：建议参数 *func* 优先指定为系统内置的聚合函数，因为系统内部对内置函数进行了优化处理。（参考下例 2）

## 参数

**X** 矩阵。

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

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

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

## 返回值

一个矩阵。

## 例子

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

```dolphindb
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 |

```dolphindb
# 按照列标签重组
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 |

```dolphindb
# 按照行标签重组
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：内置函数和用户自定函数的性能对比

```dolphindb
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：对面板数据进行分钟聚合

```dolphindb
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)
```
