첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형

TestProject.zip
다운로드

▶ Program.cs

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;

using RDotNet;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 소스 값 배열 구하기 - GetSourceValueArray(count)

        /// <summary>
        /// 소스 값 배열 구하기
        /// </summary>
        /// <param name="count">카운트</param>
        /// <returns>소스 값 배열</returns>
        private static double[] GetSourceValueArray(int count)
        {
            double[] valueArray = new double[count];

            Random random = new Random(DateTime.Now.Millisecond);

            for(int i = 0; i < count; i++)
            {
                valueArray[i] = random.NextDouble() * 100;
            }

            return valueArray;
        }

        #endregion

        #region R 실행 가능 경로 추가하기 - AddRExecutablePath()

        /// <summary>
        /// R 실행 가능 경로 추가하기
        /// </summary>
        private static void AddRExecutablePath()
        {
            string pathValue       = Environment.GetEnvironmentVariable("Path");
            string rExecutablePath = @"C:\Program Files\R\R-3.4.1\bin\x64;C:\Program Files\R\R-3.4.1\bin\i386";

            Environment.SetEnvironmentVariable("Path", pathValue + Path.PathSeparator + rExecutablePath);
        }

        #endregion

        #region 숫자 벡터 설정하기 - SetNumericVector(rEngine, variableName, sourceArray)

        /// <summary>
        /// 숫자 벡터 설정하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName">변수명</param>
        /// <param name="sourceArray">소스 배열</param>
        private static void SetNumericVector(REngine rEngine, string variableName, double[] sourceArray)
        {
            NumericVector numericVector = new NumericVector(rEngine, sourceArray);

            rEngine.SetSymbol(variableName, numericVector);
        }

        #endregion
        #region 숫자 벡터 설정하기 - SetNumericVector(rEngine, variableName, sourceEnumerable)

        /// <summary>
        /// 숫자 벡터 설정하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName">변수명</param>
        /// <param name="sourceEnumerable">소스 열거형</param>
        private static void SetNumericVector(REngine rEngine, string variableName, IEnumerable<double> sourceEnumerable)
        {
            NumericVector numericVector = new NumericVector(rEngine, sourceEnumerable);

            rEngine.SetSymbol(variableName, numericVector);
        }

        #endregion
        #region 평균 값 구하기 - GetAverageValue(rEngine, variableName)

        /// <summary>
        /// 평균 값 구하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName">변수명</param>
        /// <returns>평균 값</returns>
        private static double GetAverageValue(REngine rEngine, string variableName)
        {
            double averageValue = rEngine.Evaluate(string.Format("mean({0})", variableName)).AsNumeric().First();

            return averageValue;
        }

        #endregion
        #region 중간 값 구하기 - GetMedianValue(rEngine, variableName)

        /// <summary>
        /// 중간 값 구하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName">변수명</param>
        /// <returns>중간 값</returns>
        private static double GetMedianValue(REngine rEngine, string variableName)
        {
            double medianValue = rEngine.Evaluate(string.Format("median({0})", variableName)).AsNumeric().First();

            return medianValue;
        }

        #endregion
        #region 표준 편차 값 구하기 - GetStandardDeviationValue(rEngine, variableName)

        /// <summary>
        /// 표준 편차 값 구하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName">변수명</param>
        /// <returns>표준 편차 값</returns>
        private static double GetStandardDeviationValue(REngine rEngine, string variableName)
        {
            double medianValue = rEngine.Evaluate(string.Format("sd({0})", variableName)).AsNumeric().First();

            return medianValue;
        }

        #endregion
        #region 상관 계수 값 구하기 - GetCorrelationValue(rEngine, variableName1, variableName2)

        /// <summary>
        /// 상관 계수 값 구하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName1">변수명 1</param>
        /// <param name="variableName2">변수명 2</param>
        /// <returns>상관 계수 값</returns>
        private static double GetCorrelationValue(REngine rEngine, string variableName1, string variableName2)
        {
            double correlationValue = rEngine.Evaluate(string.Format("cor({0}, {1})", variableName1, variableName2)).AsNumeric().First();

            return correlationValue;
        }

        #endregion
        #region ANOVA 값 구하기 - GetANOVAValue(rEngine, variableName1, variableName2)

        /// <summary>
        /// ANOVA 값 구하기
        /// </summary>
        /// <param name="rEngine">R 엔진</param>
        /// <param name="variableName1">변수명 1</param>
        /// <param name="variableName2">변수명 2</param>
        /// <returns>상관 계수 값</returns>
        private static double GetANOVAValue(REngine rEngine, string variableName1, string variableName2)
        {
            GenericVector genericVector = rEngine.Evaluate(string.Format("t.test({0}, {1})", variableName1, variableName2)).AsList();

            double pValue = genericVector["p.value"].AsNumeric().First();

            return pValue;
        }

        #endregion

        #region 프로그램 실행하기 - Main()

        /// <summary>
        /// 프로그램 실행하기
        /// </summary>
        private static void Main()
        {
            AddRExecutablePath();

            // 소스 값 배열을 설정한다.
            double[] sourceValueArray1 = GetSourceValueArray(1000000);
            double[] sourceValueArray2 = GetSourceValueArray(1000000);

            using(REngine rEngine = REngine.CreateInstance("RDotNet"))
            {
                rEngine.Initialize();

                SetNumericVector(rEngine, "value1", sourceValueArray1);
                SetNumericVector(rEngine, "value2", sourceValueArray2);
                
                // 평균 값을 계산한다.
                double averageValue = GetAverageValue(rEngine, "value1");

                Console.WriteLine("평균 값   : " + averageValue.ToString());

                // 중간 값을 계산한다.
                double medianValue = GetMedianValue(rEngine, "value1");

                Console.WriteLine("중간 값   : " + medianValue.ToString());

                // 표준 편차 값을 계산한다.
                double standardDeviationValue = GetStandardDeviationValue(rEngine, "value1");

                Console.WriteLine("표준 편차 : " + standardDeviationValue.ToString());

                // 상관 계수 값을 계산한다.
                double correlationValue = GetCorrelationValue(rEngine, "value1", "value2");

                Console.WriteLine("상관 계수 : " + correlationValue.ToString());

                // ANOVA 값을 계산한다.
                double pValue = GetANOVAValue(rEngine, "value1", "value2");

                Console.WriteLine("ANOVA     : " + pValue.ToString());
            }
        }

        #endregion
    }
}

※ 상기 소스는 실행에 앞서 R 3.4.1 버전이 사전에 설치되어 있어야 한다. 버전이 상이하면 상기 AddRExecutablePath() 함수를 버전에 맞추어 수정한다.

728x90
반응형
그리드형(광고전용)
Posted by 사용자 icodebroker
TAG , , ,

댓글을 달아 주세요