I’m trying to convert a Deedle Frame into an R DataFrame using R.Net.
I tried 3 different approaches:
open RDotNet
REngine.SetEnvironmentVariables(@"C:\Program Files\R\R-3.6.3\bin\x64",@"C:\Program Files\R\R-3.6.3")
let engine = REngine.GetInstance()
//Deedle with columns x and y and with all the values as floats
let d = Frame.ReadCsv(@"C:\Users\flavi\Downloads\test.txt")
let a1 =
([],d.ColumnKeys)
||> Seq.fold (fun acc elem -> (d |> Frame.getCol elem |> Series.values |> Seq.map float)::acc) |> List.toArray
let a2 =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
let (a3 : IEnumerable array) =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
//only works with a3
let rFrame = engine.CreateDataFrame(a3,d.ColumnKeys |> Seq.map string |> Seq.toArray)
a1 (the one I would like to use) and a2 have the same signature: seq < float > []. a3 is the same as a2, the only difference being the “forced” signature of IEnumerable array. Only a3 works, but the way a3 was created is not good, since I have to insert all the columns by hand.
My questions are: 1) why only a3 works?; 2) how can I recreate a3 like a1, i.e., not having to know beforehand all the columns that exist and having IEnumerable array as signature?
CreateDataFrame() wants an array of IEnumerable, but a1 is an array of seq<float>, which is F#'s way of saying IEnumerable<float>; you just need another cast in there. This compiles for me (though I haven't actually run it):
let a1 =
d.ColumnKeys
|> Seq.fold
(fun acc key ->
let values =
d
|> Frame.getCol key
|> Series.values
|> Seq.map unbox<float>
values::acc)
[]
|> Seq.map (fun floats -> floats :> IEnumerable)
|> Seq.toArray
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With