データ分析、機械学習はできるだけpythonを使いたいが、Rにもpythonにはない便利なライブラリがたくさんありそうなので、pythonからRをコールできるPypeRなるものを使って見ました。
(当方はRを全く使ったことがありません...)
インストール
pip install pyper
さっそく使ってみる
(以下は全てjupyter上で実行しています。)
使い方は下記のように pyper.R()
でRと連携するためのインスタンスを生成する訳ですが、
import pyper
r = pyper.R()
ここで、FileNotFoundError: [Errno 2] No such file or directory: 'R'
とエラー発生。
当たり前ですが、PypeRはRがインストールされてないと使えません。
以下のRの公式から自分のOSにあったものをインストールします。
https://cran.r-project.org/
インストール後に上記の r = pyper.R()
が実行できました。
基本的な使い方は r
インスタンスにRのコードを文字列として渡せばよさそうです。
import pyper
r = pyper.R()
r("a <- 10")
print(r("a"))
# 結果
# try({a})
#[1] 10
r("b <- 5")
print(r("a + b"))
# 結果
# try({a + b})
# [1] 15
pythonとRの連携
python側で作ったデータをR側に渡してみたり、R側で作ったデータをpython側に渡してみたりしてみました。
%matplotlib inline
import pyper
import numpy
import pandas as pd
import pylab
# テキトーに乱数生成
n = 500
x = numpy.random.normal(0, 10, n)
y = numpy.random.normal(0, 10, n)
# DataFrameにする
df = {"X":x, "Y":y}
df =pd.DataFrame(df)
# pandasのオブジェクトをRで扱えるようにするためには、Rのインスタンス生成時に use_pandas='True'とすればよい
r = pyper.R(use_pandas='True')
# assignでR側に渡せる。R側でp_dfという名前の変数に格納する
r.assign("p_df", df)
# Rのsummary関数を使ってみる
print(r("summary(p_df)"))
# 出力結果
# try({summary(p_df)})
# X Y
# Min. :-32.0217 Min. :-29.2819
# 1st Qu.: -6.8550 1st Qu.: -5.6983
# Median : 0.4881 Median : 0.6689
# Mean : -0.2023 Mean : 0.4956
# 3rd Qu.: 6.4794 3rd Qu.: 6.7526
# Max. : 30.3544 Max. : 35.7937
# R側で一様分布で乱数生成
r("rx<-runif(500)")
r("ry<-runif(500)")
# データ確認
print(r("rx"))
# 出力結果
# try({rx})
# [1] 0.353890137 0.615198821 0.010748096 0.478154085 0.544522429 0.325331500
# [7] 0.241592549 0.406167952 0.545199827 0.572310302 0.168604882 0.058046145
# [13] 0.817028393 0.889809545 0.079517531 0.115438325 0.645908994 0.145381259
# [19] 0.078100969 0.681751758 0.942462240 0.853835860 0.125521639 0.457782591
# 〜省略〜
# getでR側のデータを持ってこれる
px = r.get("rx")
py = r.get("ry")
# データ確認
print(px)
# 出力結果(配列で受け取れる)
# [7.93217696e-01 5.71642368e-01 5.36547413e-01 7.68226223e-01
# 6.99345491e-01 9.46375013e-01 8.22113833e-01 3.74321974e-01
# 7.93484389e-02 8.19715370e-01 2.72596319e-01 3.05332547e-01
# 2.40291854e-01 7.22588932e-02 8.99772479e-01 8.73717549e-01
# 〜省略〜
# R側で生成したデータをpython側でプロットして表示
pylab.scatter(px, py, marker=".", linewidths="0")
なんとなく使い方がわかったような気がしました。
参考
ほとんど以下の方達の写経でした。とてもわかりやくまとめられています。
Python と R で連携する
https://qiita.com/ynakayama/items/f84dc659f1337d71dd9e
Python + PypeRでPythonからRをつかってみる
http://mia-0032.hatenablog.jp/entry/2013/08/30/000000