F# 按F中的数值范围分组#

F# 按F中的数值范围分组#,f#,deedle,F#,Deedle,一个群体如何通过F#和/或Deedle中的数字范围进行分类。也就是说,我以英尺为单位查看数据,我想将数据分组到500英尺的桶中 例如 我有这样的数据 五千 5200 5700 5800 6100 6200 6300 我想要团体 {5000,5200}{5700,5800}{6100,6200,6300}你说的“500英尺的桶”是什么意思还不完全清楚。如果我假设“bucket”定义为范围500*N。。500*(N+1),其中N是一个整数,那么您可以通过整数除以500轻松获得给定数字所属的bucke

一个群体如何通过F#和/或Deedle中的数字范围进行分类。也就是说,我以英尺为单位查看数据,我想将数据分组到500英尺的桶中

例如

我有这样的数据

五千 5200 5700 5800 6100 6200 6300

我想要团体


{5000,5200}{5700,5800}{6100,6200,6300}

你说的“500英尺的桶”是什么意思还不完全清楚。如果我假设“bucket”定义为范围
500*N。。500*(N+1)
,其中
N
是一个整数,那么您可以通过整数除以500轻松获得给定数字所属的bucket的索引。然后,您可以根据该索引进行分组:

let data = [5000; 5200; 5700; 5800; 6100; 6200; 6300]
let groups = data |> Seq.groupBy (fun x -> x/500)

> 
val groups : seq<int * seq<int>> =
  seq
    [(10, seq [5000; 5200]); (11, seq [5700; 5800]);
     (12, seq [6100; 6200; 6300])]
let data=[5000;5200;5700;5800;6100;6200;6300]
让groups=data |>Seq.groupBy(乐趣x->x/500)
> 
val组:seq=
序号
[(10,seq[5000;5200]);(11,seq[5700;5800]);
(12,seq[6100;6200;6300])]

正如您在问题中提到的Deedle,我将根据Deedle系列添加一个答案。如果您有一些观察结果,并且希望根据关键字(例如,观察次数)对数据进行分组,这将非常有用。假设我们有:

let obs = series [ 5000 => 1.0; 5200 => 2.0; 5700 => 3.0; 5800 => 4.0; 
                   6100 => 5.0; 6200 => 6.0; 6300 => 7.0 ]
现在,您可以使用以下方法为每个bucket创建一个包含一系列值的序列:

obs |> Series.chunkWhile (fun k1 k2 -> k1/500 = k2/500)
这与Fyodor的回答中的技巧相同——我们将把东西放在一个桶中,只要钥匙除以500对桶中的所有物品都是相同的

如果您想进行进一步的计算,例如获取序列每个起点的每个桶的平均值,这将非常有用:

obs 
|> Series.chunkWhile (fun k1 k2 -> k1/500=k2/500)
|> Series.mapKeys (fun k -> (k / 500) * 500)
|> Series.mapValues Stats.mean
然而,如果你只对你的问题中的计算组感兴趣,那么Deedle可能有点过头了