Как сгруппировать по значениям подряд в F #? - PullRequest
0 голосов
/ 07 июня 2018

Если я загрузил файл CSV и разделил его на строки в ПОСЛЕДОВАТЕЛЬНОСТИ.

Если есть также несколько экземпляров одного значения, скажем, в строке 1, как мне усреднить значения в строке 2 по значениям в строке 1, так что теперь у меня есть только один экземпляр каждого значения в строке 1.
{Это просто пример, и строки 1 и строки 2 являются теоретическими.}

Помните, что я работаю с последовательностью.

Пример данных и идеальный результат:ниже:

Что дано:

Row 1 --- Row 2 (Dollars)   
2010  ---    50000.198  
2010  ---    45151.451  
2011  ---    75641.372  
2011  ---    91652.710  
2012  ---    11281.450  
2012  ---    70046.154  
2012  ---    97778.054  
2013  ---    555574.501 
2013  ---    78921.215

Что я хочу:

Row 1 --- Row 2
2010  ---    47575.825
2011  ---    93647.041
2012  ---    59701.886 
2013  ---    317247.858

1 Ответ

0 голосов
/ 07 июня 2018

Похоже, вы уже проанализировали файл CSV и вывели значения в последовательность.Для этого примера, давайте предположим, что вы вытащили его в список кортежей с указанием года в качестве первого элемента и стоимости в качестве второго, что эквивалентно следующему:

let costByYear =
    [
    (2010,50000.198)
    (2010,45151.451)
    (2011,75641.372)
    (2011,91652.710)
    (2012,11281.450)
    (2012,70046.154)
    (2012,97778.054)
    (2013,555574.501)
    (2013,78921.215)
    ]

Вы можете использовать несколько Seq функцийсгруппировать по году (Seq.groupBy), а затем усреднить стоимость (Seq.average):

let avgCostPerYear =
    let avg (year, costs) = (year, Seq.average <| Seq.map snd costs)
    Seq.groupBy fst >> Seq.map avg

Выполнить это:

printfn "%A" (avgCostPerYear costByYear)

выход:

seq
  [(2010, 47575.8245); (2011, 83647.041); (2012, 59701.886); (2013, 317247.858)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...