LoginSignup
30
35

More than 5 years have passed since last update.

PypeRを使ってみた

Last updated at Posted at 2018-03-21

データ分析、機械学習はできるだけ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")

image.png

なんとなく使い方がわかったような気がしました。

参考

ほとんど以下の方達の写経でした。とてもわかりやくまとめられています。

Python と R で連携する
https://qiita.com/ynakayama/items/f84dc659f1337d71dd9e

Python + PypeRでPythonからRをつかってみる
http://mia-0032.hatenablog.jp/entry/2013/08/30/000000

30
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
35