如何根据组标准进行过滤?

jks*_*612 3 f#

我是一名R开发人员,有兴趣擅长F#所以这个问题是如何塑造和重塑数据的更广泛主题的一部分.

问题:NYC Flight Delays数据集中
三个月有超过7000个天气延迟.我想过滤所有其他月份,以便我只有这三个月来分析.如何在F#中完成?长期的F#解决方案只是呼叫R吗?或者.NET中是否存在可以执行这些任务的强大数据库.

Mar*_*ann 6

您可以使用CSV类型提供从FSharp.Data得到强类型的访问从互联网地址数据,甚至直接:

#r "../packages/FSharp.Data.2.2.5/lib/net40/FSharp.Data.dll"

open System
open FSharp.Data

type FlightDelays =
    CsvProvider<"https://raw.githubusercontent.com/wiki/arunsrinivasan/flights/NYCflights14/delays14.csv">
Run Code Online (Sandbox Code Playgroud)

这为您提供了对数据源的强类型访问.例如,要查找天气延迟超过7000的所有月份,您可以执行以下操作:

let monthsWithDelaysOver7k =
    FlightDelays.GetSample().Rows
    |> Seq.filter (fun r -> not (Double.IsNaN r.Weather_delay))
    |> Seq.groupBy (fun r -> r.Year, r.Month)
    |> Seq.map (fun ((y, m), rs) -> y, m, rs |> Seq.sumBy (fun r -> r.Weather_delay))
    |> Seq.filter (fun (y, m, d) -> d >= 7000.)
Run Code Online (Sandbox Code Playgroud)

转换为列表,数据如下所示:

> monthsWithDelaysOver7k |> Seq.toList;;
val it : (int * int * float) list =
  [(2014, 1, 118753.0); (2014, 2, 59567.0); (2014, 4, 7618.0);
   (2014, 5, 11594.0); (2014, 6, 15928.0); (2014, 7, 54298.0);
   (2014, 10, 7241.0)]
Run Code Online (Sandbox Code Playgroud)

您现在可以使用它monthsWithDelaysOver7k来获取这些月份中的所有行.

您可以编写一些比上述更有效的查询,但这可以让您了解如何解决问题.