2014-06-08 44 views
1

我想根據值列表過濾一個Deedle數據框我該如何去做這件事?基於列表的f#deedle過濾器數據框

我有一個主意,用下面的下面的代碼:

let d= df1|>filterRowValues(fun row -> row.GetAs<float>("ts") = timex) 

但是這個問題是,它只是基於一個變量,我則認爲這與結合的循環和追加的功能:

for i in 0.. recd.length -1 do 
    df2.Append(df1|>filterRowValues(fun row -> row.GetAs<float>("ts") = recd.[i])) 

但是,這不起作用,並且必須有更好的方法來做到這一點,而不使用for循環。在R我可以例如使用%in%。

回答

3

您可以使用F#集合類型來創建一組您感興趣的值。在過濾中,您可以檢查該集合是否包含該行的實際值。

例如,假設您有recd類型seq<float>。那麼你應該能夠編寫:

let recdSet = set recd 
let d = df1 |> Frame.filterRowValues (fun row -> 
    recdSet.Contains(row.GetAs<float>("ts")) 

一些其他的東西,可能是有用的:

  • 你可以只用row?ts取代row.GetAs<float>("ts")(它總是返回float,當你有一個固定的只能名稱,像「ts」,但它使代碼更好)

  • 比較float值可能不是最好的事情要做(因爲浮點不精確,這可能不會方式按預期工作)。

相關問題