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 ofseq<float>, which is F#'s way of sayingIEnumerable<float>; you just need another cast in there. This compiles for me (though I haven't actually run it):