PythonでRを扱えるようになろう。
歴史上、データサイエンスの世界では常に2つの言語がデータ解析の分野でしのぎを削ってきました。
RとPythonです。
この2つのプログラミング言語には、それぞれファンがいて、それぞれに利点があります。
Rは統計解析のサポートが充実していて専門性が高く、Pythonはオブジェクト指向のアプローチと他のモジュールとの圧倒的な統合性を備えています。
PythonとRの長所と短所は、組み合わせると強力なコンビになります。
なぜなら、Pythonに欠けているものはRが圧倒し、その逆もまた然りだからです。
そこで、開発者は今日のトピックである rpy2 ライブラリを作成しました。
このことは、両者の組み合わせを必要とする開発者にとって、何を意味するのでしょうか?チャンスです。
rpy2 モジュールのインストール
Rpy2`モジュールは、必要なバージョンのRがインストールされている場合にのみ動作するという前提条件があります。
他のモジュールと同様に、rpy2モジュールは、Pythonディストリビューションのpipパッケージインストーラーを使用してインストールする必要があります。
pipでは、rpy2をインストールするためのコマンドは単純です。
pip install rpy2
|
これで、必要なモジュールが自動的にインストールされ、Pythonスクリプトの中で動作させることができるようになります。
システムを濡らす前にrpy2の機能を試したい場合は、まずdockerイメージで作業してみることができます。
rpy2 モジュールを使って Python で R を使う
PythonでRを使うために、まずコードにrpy2をインポートします。
import rpy2
from rpy2 import robjects
|
これで、PythonでRを使うことができるようになりました。
しかし、両者の長所を生かす前に、このモジュールにおけるR言語の利用方法のわずかな違いについて調べておくと便利です。
1. rpy2によるパッケージのインポート
Rで作業する多くの部分は、データ解析のためのパッケージをインポートすることと関係しています。
そして、rpy2は py2.robjects.packages.importr() 関数を通して、私たちにこれを提供してくれています。
この関数は、Rのために設計されたパッケージをPythonにインポートする方法として機能し、スクリプトの中で両方の言語の機能を本質的に利用することができます。
from rpy2.robjects.packages import importr
# imports the base module for R.base = importr("base")
# imports the utils package for R.utils = importr("utils")
|
このメソッドでインポートされた関数を使用することができます。
2. PythonでRを操作する
スクリプトの中でRを扱う方法は、robjects.rインスタンスを使うことで、本質的にRコンソールを使うことができるようになります。
これは、Rのコンソールを使用するためのものです。
これは、rpy2モジュールが組み込みのRのバックステージを実行しているためです。
# Essentially retrieving the value of pi in the R consolepi = robjects.r['pi']
print(pi[0])
# Output : 3.14159265358979 |
この方法は1行のコードでは有効かもしれません。
しかし、Rで処理する必要がある巨大なコードの断片を扱う場合には、この方法は実行可能な方法ではないことを述べておきます。
幸いなことに、コードのブロック全体を3つの引用符で囲んで入力することができます。
robjects.r('''
# create a function `f`
f <- function(r, verbose=FALSE) {
if (verbose) {
cat("I am calling f().
}
2 * pi * r
}
# call the function `f` with argument value 3
f(3)
''')
# The result of the function is returned to the Python Environment |
この関数自体はRのグローバル環境に存在しますが、 robjects.globalenv['f'] というコマンドでアクセスすることができます(fはR環境の変数)。
rpy2`モジュールは多くの機能を提供してくれますが、最初は少し難しく見えるかもしれません。
ここでは、Rのさまざまな機能を使った例をいくつか紹介します。
# Working with different kinds of vectorsres1 = robjects.StrVector(['abc', 'def'])
res2 = robjects.IntVector([1, 2, 3])
res3 = robjects.FloatVector([1.1, 2.2, 3.3])
print(res1.r_repr())
# Output : c("abc", "def")print(res2.r_repr())
# Output : 1:3print(res3.r_repr())
# Output : c(1.1, 2.2, 3.3)# Working with different functions of Rrsort = robjects.r['sort']
res4 = rsort(robjects.IntVector([1,2,3]), decreasing=True)
print(res4.r_repr())
# Working with matrices in Rv = robjects.FloatVector([1.1, 2.2, 3.3, 4.4, 5.5, 6.6])
m = robjects.r['matrix'](v, nrow = 2)
print(m)
# Output :# [,1] [,2] [,3]# [1,] 1.1 3.3 5.5# [2,] 2.2 4.4 6.6# Working with Graphics in Rr = robjects.r
x = robjects.IntVector(range(10))
y = r.rnorm(10)
r.X11()r.layout(r.matrix(robjects.IntVector([1,2,3,2]), nrow=2, ncol=2))
r.plot(r.runif(10), y, xlab="runif", ylab="foo/bar", col="red")
|
3. 前へ進む
2 つの異なる言語を使って問題解決に取り組むという実装は、新しい発見への扉を大きく開くものです。
PythonでRと連携することで、Pythonが提供する機能を利用して、様々な異なるモジュールと連携し、データサイエンスや数理論理学の分野で機能を拡張していくことができます。
Pandas、OpenCV、Scikit-Learnをプログラムに統合することで、言語が提供する機能を妨げることなく、新しいアイデアを拡張し、試すことができますので、検討する価値があります。
もし、ある機能が rpy2 モジュールで使えるかどうか迷ったら、よく整備されたドキュメントを自由に閲覧してください!
rpy2 の代替となるもの
rpy2` は素晴らしいモジュールですが、どのモジュールが一番自分に合っているかを確認するために、他のモジュールも調べてみたいと思うかもしれません。
そこで、rpy2にない機能や好みに合わない機能の回避策を探すのではなく、どのモジュールが必要かを知るためのリストを紹介します。
- rJython
- rPython
- SnakeCharmR
- PythonInR
- レティキュレート
まとめ
これで rpy2 モジュールが何を提供し、どのようにセットアップすればあなたのコードで作業を始められるかがわかったので、R と Python の間の争いを気にせずに計算のために出航することができます。
結局のところ、今はどちらもあなたの味方なのです。
pandasやmatplotlibの他のモジュールを使った他の作品も見て、数学とデータサイエンスの旅に出かけましょう。
参考文献
- rpy2公式ドキュメント
- Reticulate の GitHub
- Quora : PythonでRを実行できますか?