deedle aggregate/group 基于 Frame 列中的 运行 个数字

deedle aggregate/group based on running numbers in a column of Frame

假设我有一个 Frame,如下所示,

  "     Name    ID     Amount
0 -> Joe        51       50    
1 -> Tomas      52       100

2 -> Eve        65       20   

3 -> Suzanne    67       10 

4 -> Suassss    69       10 
5 -> Suzanne    70       10 

6 -> Suzanne    78       1 
7 -> Suzanne    79       10 
8 -> Suzanne    80       12

9 -> Suzanne    85       10 

10 -> Suzanne    87       10 
...

我想要实现的是基于 ID 列进行分组或聚合,这样如果遇到 运行 数字序列,则应将这些行分组在一起,否则,行本身是一个组。

我相信递归函数是你的朋友。

提供元组列表

let data = [(Joe, 51, 50);
            (Tomas, 52, 100);
            (Eve, 65, 20);
            (Suzanne, 67, 10)]

一个函数

let groupBySequencialId list =
    let rec group result acc data lastId =
        match data with
        | [] -> acc :: result
        | (name, id, amount) :: tail ->
            if lastId + 1 = id then
                group result ((name, id, amount) :: acc) tail id
            else
                group (acc :: result) ([(name, id, amount)]) tail id

    group [] [] data 0

你会得到你想要的结果。

除三点注意事项外,这应该可以完成工作。

  1. 您需要将字符串解析为所需的元组
  2. 结果集中有一个空列表,因为第一个递归不匹配并将空累加器追加到结果集中
  3. 榜单出来会反的

另请注意,这是一个高度专业化的功能。 如果我是你,如果你打算重用它,我会尽量让它更通用。

玩得开心。