1

我创建了这个代码示例来将 c# DataTable 类型的对象传递给 R.Net dataFrame。

public static DataFrame ConvertDataTableToRDataFrame(DataTable tab)
{
    REngine.SetEnvironmentVariables();
    REngine engine = REngine.GetInstance();
    double?[,] stringData = new double?[tab.Rows.Count, tab.Columns.Count];
    DataFrame df = engine.Evaluate("df=NULL").AsDataFrame();
    int irow = 0;
    foreach (DataRow row in tab.Rows)
    {
        NumericVector x = engine.Evaluate("x=NULL").AsNumeric();
        int icol = 0;
        foreach (DataColumn col in tab.Columns)
        {
            if (row.Field<double?>(col) == null)
            {
                x = engine.Evaluate("x=c(x, NA) ").AsNumeric();
            }
            else { x = engine.Evaluate("x=c(x, " + row.Field<double?>(col) + ") ").AsNumeric(); }
            icol++;
        }
        df = engine.Evaluate("df= as.data.frame(rbind(df,x)) ").AsDataFrame();
        irow++;
    }
    return (df);
}

在我尝试检查数据框的内容之前,一切似乎都运行良好。我发现像1.2355将数据框转为12355. 由于某些未知原因,它不能识别.为小数分隔符。

4

1 回答 1

1

-添加@Panagiotis Kanavos 命题作为答案,因为它解决了问题-

小数没有任何特定的小数分隔符,它们是二进制值。仅当它们转换为字符串时才使用分隔符。根据定义,的输出row.Field<double?>(col)将是 a Nullable<double>,但将其连接到字符串将使用当前用户的文化将其转换为字符串。

改为使用String.Format(CultureInfo.InvariantCulture,"x=c(x, {0})" ,row.Field<double?>(col)),或"x=c(x, " + row.Field<double?>(col).ToString(CultureInfo.InvariantCulture) + ") "–</p>

于 2016-06-17T09:32:44.917 回答