How to create a dataframe of multiple types with the RTypeProvider

大憨熊 提交于 2019-12-11 06:55:37

问题


It seems like the RTypeProvider can only handle namedParams of the same type. Is this the case?

For example,

open RDotNet
open RProvider 

type foo = {
    Which: string
    Qty: float option
    }    

let someFoos = [{Which = "that"; Qty = Some 4.0}; {Which = "other"; Qty = Some 2.0}]

let thingForR = 
    namedParams [
        "which", someFoos |> List.map (fun x -> x.Which); 
        "qty", someFoos |> List.map (fun x -> x.Qty);
        ]
    |> R.data_frame

doesn't work as I get an error on the x.Qty saying

This expression was expected to have type 
  string
but here has type
  float option

If I reverse the order in the thingForR let, then I get the opposite error:

let thingForR = 
    namedParams [
        "qty", someFoos |> List.map (fun x -> x.Qty); 
        "which", someFoos |> List.map (fun x -> x.Which);
        ]
    |> R.data_frame

Here, the error on x.Which is

This expression was expected to have type
  float option
but here has type
  string

Can the dictionary in the namedParams not have different types? If so, how can you create a data frame with different types in F# and pass them to R?


回答1:


You need to box the values inside the dictionary. That way they are all just object. So:

let thingForR = 
    namedParams [
        "which", box (someFoos |>  List.map (fun x ->  x.Which) ); 
        "qty", box  (someFoos |> List.map (fun x ->   x.Qty) |> List.map (Option.toNullable >> float));
        ]
    |> R.data_frame

gives me:

val thingForR :
SymbolicExpression = which qty
1 that 4
2 other 2

Please refer to your previous question on float option to convert the Option list to float list. Also string option if necessary.

You can go through Deedle (if not for the option values):

let someFoos' = [{Which = "that"; Qty =  4.0}; {Which = "other"; Qty =  2.0}]
let df' = someFoos' |> Frame.ofRecords
df' |> R.data_frame 


来源:https://stackoverflow.com/questions/39479934/how-to-create-a-dataframe-of-multiple-types-with-the-rtypeprovider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!