PythonからRを使いたい -だがRPy2おめーはダメだ-

経緯

とある事情でランダムフォレストを使いたいのだがrandomForestパッケージは因子のレベルが32までというFORTRAN実装を引きずっており今回のデータには合わない。
ならばとpartyパッケージのcforestを使ってみたが今度はメモリが足りなくなった。
諦めて因子のレベルを32以内にすればいいのだろうが、せっかくなのでPythonを使ってみたい。
で、Scikit-learnにランダムフォレストが実装されてるとのことなので入れてみた。
http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn
Scikit-learnについてはこれでおしまい。

ところで、↑のサイトを眺めているとRPy2がある。
RPy2に関しては当方Win7の64bit環境だが以前は32bitのものしかなくインストールすらうまくいかなかったことを思い出した。
http://stackoverflow.com/questions/3008509/python-version-2-6-required-which-was-not-found-in-the-registry
今度こそはと思い、RPy2をインストールしてみたらインストールはうまくいったがいざ動かすとなるとエラーが出てうまく動かない。
調べるとこんな話が出てくる。
http://stackoverflow.com/questions/5630441/how-do-rpy2-pyrserve-and-pyper-compare
_人人 人人人人 人人人人 人人人人 _
> MSWindows with limited support <
 ̄Y^Y^Y^YY^Y^Y^YY^Y^Y^YY^Y^Y^YY^Y^ ̄
どうもみんなWindowsに冷たい。
対処法↓も無いことはないようだが、RPy2はまた今度にしてPypeRを入れることにした。
http://vhaguiar.wordpress.com/2011/03/01/python-rpy2-with-python-2-6-and-r-2-12-1-r_home-path-problem-2/
以上が今回の経緯。

PypeRとは

詳しい話はリリース時の紹介記事とサンプルコードを並べておくのでそちらでどうぞ。
http://www.jstatsoft.org/v35/c02/paper
http://statcompute.wordpress.com/2012/11/29/another-way-to-access-r-from-python-pyper/
pandas対応していることと、Windowsに優しいというのが選んだ決め手です。

PypeRこんな感じ

上記サンプルコードを真似しつつ書くと以下の様な感じになる。
ポイントは3つ。

  • .RでRを起動
  • .R.assignでPython→Rの受け渡し
  • .R.getでR→Pythonの受け渡し
import pyper as pr
import pandas as pd

smpdata = pd.read_csv("iris.csv")

# Rのインスタンスを作る
r = pr.R(use_pandas = "True")

#Python側のデータをRに渡す
r.assign("rdata", smpdata)

# Rのpartyライブラリを使って決定木を作る
r("summary(rdata)")
r("library(party)")
r("res = ctree(data = rdata, Species~.)")

# R側で決定木の結果をプロットする
r("pdf('sample.pdf')")
r("plot(res)")
r("dev.off()")

# Rで予測した結果をPythonに渡す
r("fit <- predict(res)")
pydata = pd.DataFrame(r.get("fit"), columns = ["Species_predict"])
print(pydata.Species_predict)

enjoy!!