rowGroupby

语法

rowGroupby(func, funcArgs, groupingCol, [mode='tuple'], [ascending=true])

参数

func 一个聚合函数。

funcArgs 是函数 func 的参数。如果有多个参数,则用元组表示,且每个元素的维度必须和 groupingCol 保持一致。

groupingCol 非空矩阵或数组向量,用于分组。

mode 可选参数,指定 rowGroupby 返回值的数据形式,默认为 "tuple"。可取值为:

  • "tuple":返回一个长度为2的 tuple,其第1个元素是一个数组向量,存储分组变量,第2个元素是一个数组向量,存储各分组中 funcArgs 应用 func 后的结果。

  • "dict":返回一个字典。包含两个元素:'key' 和 'value',分别存储分组变量和各分组中 funcArgs 应用 func 后的结果。

  • "table":返回一个包含两列的表。字段为 "key" 和 "value",分别存储分组变量及各分组中 funcArgs 应用 func 后的结果。

ascending 布尔值,表示输出结果按 groupingCol 升序还是降序排序。默认值为 true(升序)。

详情

groupingCol 的每一行分组后,在每个分组中计算 func(funcArgs),每组的计算结果是一个标量。该函数将根据 mode 指定的形式输出结果。

例子

下例对表 t 中的 price 列按升序排序后分组,对每个分组内对应的 qty 进行求和。

sym=`A`B
price = array(DOUBLE[], 0).append!([12.5 12.6 12.5 12.5 12.6, 15.5 15.5 15.5 15.3 15.3])
qty = array(INT[], 0).append!([201 212 220 215 214, 210 213 223 219 211])
t=table(sym,price,qty) 
//指定 mode='dict' 时,以字典形式输出结果,其中 key 存储 price 排序后分组的结果,value 存储对 qty 分组求和的结果
rowGroupby(func=sum,funcArgs=t.qty,groupingCol=t.price,mode='dict') 

/* output:
value->[[636,426],[430,646]]
key->[[12.5,12.6],[15.3,15.5]]
*/

//指定 ascending=false,按照 price 降序输出结果。
rowGroupby(func=sum,funcArgs=t.qty,groupingCol=t.price,mode='dict', ascending=false)
/* output:
value->[[426,636],[646,430]]
key->[[12.6000,12.5000],[15.5000,15.3000]]
*/

//指定 mode='table' 时,以表的形式输出结果,其中 key 存储 price 排序后分组的结果,value 存储对 qty 分组求和的结果
rowGroupby(func=sum,funcArgs=t.qty,groupingCol=t.price,mode='table')
key value
[12.5,12.6] [636,426]
[15.3,15.5] [430,646]
//指定 mode='tuple',输出结果为 tuple,将 tuple 的两个元素重命名后作为表的一列输出。
select rowGroupby(sum, qty, price, 'tuple') as `a`b from t
a b
[12.5,12.6] [636,426]
[15.3,15.5] [430,646]

接下来通过一个例子来展示如何在矩阵上使用 rowGroupby 函数:

m=matrix([32.5 12.6 22.5 42.5 32.6, 17.5 25.5 35.5 17.3 19.3, 17 20.1 30 13 19])
g=matrix([1 2 2 5 4, 2 2 3 2 1, 1 3 2 3 5])
//对 g 的每行排序后分组,对 m 的每行在每个组内进行求和
rowGroupby(func=sum, funcArgs=m, groupingCol=g, mode='table')
key value
[1,2] [49.5,17.5]
[2,3] [38.1,20.1]
[2,3] [52.5,35.5]
[2,3,5] [17.3,13,42.5]
[1,4,5] [19.3,32.6,19]