如何在F#中按人口增加收入?

时间:2018-06-08 21:11:44

标签: f#

我的数据如下。我使用了三列,我希望能够根据有多少人的收入来衡量收入。国家有多个实例,因为每个收入都在不同的范围内。例如:

45000 * 8500/(8500+7800+1200) + 
78000 * 7800/(8500+7800+1200) + 
80000 * 1200/(8500+7800+1200)    =  The Total <- this is the number I need, PER State

我想根据收入范围内的人口数量来衡量收入。

所以对于AL,我需要:

{{1}}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

也许是这样的......

type Data = 
    {State : string
     Income : float
     Pop : float }

let data = 
    [{State="AL"; Income=45000.; Pop=8500.};
     {State="AL"; Income=78000.; Pop=7800.};
     {State="AL"; Income=80000.; Pop=1200.};
     {State="TX"; Income=500000.;Pop= 500.};
     {State="TX"; Income=100000.;Pop= 700.};
     {State="TX"; Income=40000.; Pop=8000.};
     {State="MO"; Income=100000.;Pop= 7000.};
     {State="MO"; Income=780000.;Pop= 1000.};
     {State="MO"; Income=79000.; Pop=1500.} ]

data 
|> List.map(fun r -> r.State) 
|> List.distinct
|> List.map (fun state ->
    let stateRecords = data |> List.filter (fun r -> r.State = state)
    let statePopulation= stateRecords |> List.map (fun r -> r.Pop) |> List.sum
    let avg = stateRecords |> List.map (fun r -> r.Income * r.Pop / statePopulation) |> List.sum
    (state, avg)
    )

答案 1 :(得分:0)

另一个选择

data
|> List.groupBy (fun x -> x.State)
|> List.map
    (fun (state, grp) ->
        let n, d = 
            List.fold 
                (fun (n, d) v -> 
                    n + v.Pop *  v.Income, d + v.Pop) 
                (0.0, 0.0) grp 
        state, n / d)

如果您的数据按状态排序,我想可能更好的性能使用一些折叠功能&#34;立即&#34;而不是先调用groupBy