долю совокупного/группы, основанные на побегушках в колонну рамы
Скажем, у меня есть 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
таким образом, чтобы, если встречается последовательность бегущих чисел, эти строки должны быть сгруппированы вместе, иначе сама строка является группой.
1 ответ:
Я полагаю, что рекурсивная функция-это ваш друг.
Скормите список кортежей
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
И вы получите результат, который вы ищете.
Это должно сделать работу, за исключением трех предостережений.
- вам нужно разобрать строку на необходимые кортежи
- в результирующем наборе есть пустой список, потому что первая рекурсия не совпадает и добавляет пустой накопитель к результирующему набору
- в список выйдет обратным
Также обратите внимание, что это узкоспециализированная функция. На вашем месте я бы постарался сделать это более общим, если вы когда-нибудь планируете использовать его повторно.
Веселитесь.