Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R.net将C#中的数据表转换为R中的data.fame_C#_R_R.net - Fatal编程技术网

如何使用R.net将C#中的数据表转换为R中的data.fame

如何使用R.net将C#中的数据表转换为R中的data.fame,c#,r,r.net,C#,R,R.net,我需要将我定义如下的数据表转换为R中的数据帧 DataTable dtb = new DataTable(); dtb.Columns.Add("Column1", Type.GetType("System.String")); dtb.Columns.Add("Column2", Type.GetType("System.String")); DataRow dtr1 = dtb.NewRow();

我需要将我定义如下的数据表转换为R中的数据帧

DataTable dtb = new DataTable();
            dtb.Columns.Add("Column1", Type.GetType("System.String"));
            dtb.Columns.Add("Column2", Type.GetType("System.String"));
            DataRow dtr1 = dtb.NewRow();
            dtr1[0] = "abc";
            dtr1[1] = "cdf";
            dtb.Rows.Add(dtr1);
            DataRow dtr2 = dtb.NewRow();
            dtr2[0] = "asdasd";
            dtr2[1] = "cdasdasf";
            dtb.Rows.Add(dtr2);
有没有办法将上面的DataTable“
dtb
”转换为R中的data.frame。
我在C#中定义了这个数据表,但我需要在R中进行计算,这就是为什么我需要将它传递给R。

我想你可以在这里得到你的解决方案。。
这一个有更好的解释

这在R.NET 1.6.5中工作,并输出:

没有找到一种很好的方法将DataTable转换为CreateCharacterMatrix所期望的字符串[,],但CreateDataFrame是另一种可能性,但它需要IEnumerable[],并且是面向列的(如R中的data.frame)

在源代码中进行测试可能有助于进一步:

还有一点:

这在某些方面更有帮助,因为官方文件很少:

使用系统;
使用系统数据;
使用RDotNet;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dtb=新的DataTable();
Add(“Column1”,Type.GetType(“System.String”);
Add(“Column2”,Type.GetType(“System.String”);
DataRow dtr1=dtb.NewRow();
dtr1[0]=“abc”;
dtr1[1]=“cdf”;
dtb.Rows.Add(dtr1);
DataRow dtr2=dtb.NewRow();
dtr2[0]=“asdasd”;
dtr2[1]=“cdasdasf”;
dtb.Rows.Add(dtr2);
使用(var engine=REngine.GetInstance())
{
string[,]stringData=新字符串[dtb.Rows.Count,dtb.Columns.Count];
for(int row=0;rowengine.Evaluate(“myRDataFrame据我所知,似乎最好的方法是将数据表转换为数字矩阵,或者将其转换为字符串。我还没有将数据从C#应用程序传递给R(我自己),但似乎使用C#字符串作为R引擎的命令通常是获取R环境中定义的命令和对象的最佳方式。(请参阅;)。此外,如果可能的话,我建议将您可能希望使用的任何数据放置在数据库(MySQL或其他一些数据库)中然后使用R的
RODBC
包将数据拉入R。这似乎是一种发挥两个程序优势的方法。@Benjamin,我将
DataTable
转换为
string
,但我如何使用它?将DataTable转换为数组并使用R.NET转换函数如何?比如,我得到了一个
stri通过将
DataTable
转换为字符串,ng
。现在如何将其传递到R.net。因为
string
是不可接受的。
string csvfile=datatabletosv(dtb)如果你能把它变成CSV,你应该能用
read.CSV
把它读入R。如果你把它保存到一个文件中,你可以只使用普通的
read.CSV
。如果你把它保存到一个字符串中作为对象传递给R,你可以使用
read.CSV(textConnection(…)
using System;
using System.Data;
using RDotNet;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dtb = new DataTable();
            dtb.Columns.Add("Column1", Type.GetType("System.String"));
            dtb.Columns.Add("Column2", Type.GetType("System.String"));
            DataRow dtr1 = dtb.NewRow();
            dtr1[0] = "abc";
            dtr1[1] = "cdf";
            dtb.Rows.Add(dtr1);
            DataRow dtr2 = dtb.NewRow();
            dtr2[0] = "asdasd";
            dtr2[1] = "cdasdasf";
            dtb.Rows.Add(dtr2);

            using (var engine = REngine.GetInstance())
            {
                string[,] stringData = new string[dtb.Rows.Count, dtb.Columns.Count];
                for (int row = 0; row < dtb.Rows.Count; row++)
                {
                    for (int col = 0; col < dtb.Columns.Count; col++)
                    {
                        stringData[row, col] = dtb.Rows[row].ItemArray[col].ToString();
                    }
                }
                CharacterMatrix matrix = engine.CreateCharacterMatrix(stringData);
                engine.SetSymbol("myRDataFrame", matrix);
                engine.Evaluate("myRDataFrame <- as.data.frame(myRDataFrame, stringsAsFactors = FALSE)");
                engine.Evaluate("str(myRDataFrame)");

            }
            Console.ReadKey();
        }
    }
}