我的数据如下。我使用了三列,我希望能够根据有多少人的收入来衡量收入。国家有多个实例,因为每个收入都在不同的范围内。例如:
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}}
有什么建议吗?
答案 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
。