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
你会得到你想要的结果。
除三点注意事项外,这应该可以完成工作。
- 您需要将字符串解析为所需的元组
- 结果集中有一个空列表,因为第一个递归不匹配并将空累加器追加到结果集中
- 榜单出来会反的
另请注意,这是一个高度专业化的功能。
如果我是你,如果你打算重用它,我会尽量让它更通用。
玩得开心。
假设我有一个 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
你会得到你想要的结果。
除三点注意事项外,这应该可以完成工作。
- 您需要将字符串解析为所需的元组
- 结果集中有一个空列表,因为第一个递归不匹配并将空累加器追加到结果集中
- 榜单出来会反的
另请注意,这是一个高度专业化的功能。 如果我是你,如果你打算重用它,我会尽量让它更通用。
玩得开心。