2

我需要将我定义如下的数据表转换为 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#中定义了这个DataTable但是我需要在R中进行计算,这就是我需要将它传递给R的原因。

4

2 回答 2

5

这适用于 R.NET 1.6.5 并输出:

控制台应用程序的输出

没有像 CreateCharacterMatrix 期望的那样找到将 DataTable 转换为 string[,] 的好方法,但 CreateDataFrame 是另一种可能性,但它需要一个 IEnumerable[] 并且是面向列的(就像 R 中的 data.frame 一样)。

通过源代码中的测试可能会有所帮助: https ://github.com/jmp75/rdotnet/tree/master/RDotNet.Tests

还有这个:https ://github.com/jmp75/rdotnet-onboarding

这在某些方面更有帮助,因为官方文档很少: https ://jmp75.github.io/rdotnet/getting_started/

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();
        }
    }
}
于 2015-10-20T22:13:57.293 回答
1

我想你可以在这里得到你的解决方案。通过 COM 将 DataTable 传递到 R 这个有更好的解释

于 2015-10-20T11:32:24.293 回答