Comment convertir des colonnes DataTable IEnumerable [] qui est nécessaire pour créer une trame de données dans R.NETcolonnes DataTable dactylographié IEnumerable []
je le code suivant:
DataTable dt = CreateDateTable();
REngine e = REngine.GetInstance();
IEnumerable[] columns = new IEnumerable[dt.Columns.Count];
string[] columnNames = dt.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.ToArray();
for(int i=0; i<dt.Columns.Count; i++)
//This is the place where I am stuck. How to convert column to base type array instead of object array
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row[i]).ToArray();
DataFrame df = e.CreateDataFrame(columns: columns,
columnNames: columnNames,
stringsAsFactors: false);
I obtenir l'exception suivante:
Test 'XXX.ReadResultsTest' failed: System.NotSupportedException : Cannot convert type System.Object[] to an R vector
w RDotNet.REngineExtension.ToVector(REngine engine, IEnumerable values)
w System.Array.ConvertAll[TInput,TOutput](TInput[] array, Converter`2 converter)
w RDotNet.REngineExtension.CreateDataFrame(REngine engine, IEnumerable[] columns, String[] columnNames, String[] rowNames, Boolean checkRows, Boolean checkNames, Boolean stringsAsFactors)
DataTable
a des colonnes de types différents et je ne sais pas quels sont les types, donc je ne peux pas faire comme dans cet exemple avec double
:
for (int i = 0; i < dt.Columns.Count; i++)
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row.Field<double>(i)).ToArray();
MISE À JOUR
Jusqu'à présent, j'ai une solution laide, peut-il être mieux fait?
for (int i = 0; i < dt.Columns.Count; i++)
{
switch (Type.GetTypeCode(dt.Columns[i].DataType))
{
case TypeCode.String:
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row.Field<string>(i)).ToArray();
break;
case TypeCode.Double:
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row.Field<double>(i)).ToArray();
break;
case TypeCode.Int32:
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row.Field<int>(i)).ToArray();
break;
case TypeCode.Int64:
columns[i] = dt.Rows.Cast<DataRow>().Select(row => row.Field<long>(i)).ToArray();
break;
default:
//columns[i] = dt.Rows.Cast<DataRow>().Select(row => row[i]).ToArray();
throw new InvalidOperationException(String.Format("Type {0} is not supported", dt.Columns[i].DataType.Name));
}
}
Merci pour la réponse, mais cette solution ne fonctionne que lorsque la structure de la table de données est connue. J'ai besoin d'une solution universelle, sans connaître la structure de datatable. –
Ah ok je comprends maintenant - j'ai édité ma réponse pour montrer comment cela peut être accompli. –
Veuillez noter que la liste des types de dynamic ne comprend pas la même annonce IEnumerable [] qui est par exemple. un tableau de tableau. Ceci est nécessaire pour RDotNet –