将十进制值从 dataTable 传递到 dataFrame 失败
Passing decimal values from dataTable to dataFrame fails
我创建了此代码示例以将 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
。由于某些未知原因,它无法将 .
识别为小数点分隔符。
-添加@Panagiotis Kanavos 命题作为答案,因为它解决了问题-
小数没有任何特定的小数分隔符,它们是二进制值。仅当将它们转换为字符串时才使用分隔符。根据定义,row.Field<double?>(col)
的输出将是 Nullable<double>
,但将其连接到字符串会使用当前用户的区域性将其转换为字符串。
改用String.Format(CultureInfo.InvariantCulture,"x=c(x, {0})" ,row.Field<double?>(col))
,或"x=c(x, " + row.Field<double?>(col).ToString(CultureInfo.InvariantCulture) + ") "
–
我创建了此代码示例以将 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
。由于某些未知原因,它无法将 .
识别为小数点分隔符。
-添加@Panagiotis Kanavos 命题作为答案,因为它解决了问题-
小数没有任何特定的小数分隔符,它们是二进制值。仅当将它们转换为字符串时才使用分隔符。根据定义,row.Field<double?>(col)
的输出将是 Nullable<double>
,但将其连接到字符串会使用当前用户的区域性将其转换为字符串。
改用String.Format(CultureInfo.InvariantCulture,"x=c(x, {0})" ,row.Field<double?>(col))
,或"x=c(x, " + row.Field<double?>(col).ToString(CultureInfo.InvariantCulture) + ") "
–