この記事のモチベーション
- RStudioでRをメインに使用しているが、やりたいことがPythonでシンプルに可能である場合に、RとPythonのいいとこ取りをしたい。
- Pythonで作成したデータフレームをRに読み込んでRの慣れた環境で解析できるようにしたい。
問題点
- Pythonのpandasはデータ分析のライブラリを収載したパッケージである。
- RStudio上でPythonでのpandas作成したデータフレームをreticulateライブラリで読み込むことはできるが、Pythonのデータフレーム名をそのままRで読み込むと、全く形式が異なってしまいRで再利用できない。
- Rで作成したデータフレームはPythonで読み込み可能であることから、PythonからRのデータのやり取りをスムーズに行いたい。
解決方法
- 参考記事に記載のPythonで作成したデータフレームをRで読み込める形のファイル(RDF形式)に出力し、Rで読み込むことで可能となった。
- 本記事はmacOSかつminiconda/conda-forgeの環境でPythonを設定した条件で動作確認を行いました。
方法
必要なパッケージのインストール
今回はpandas, pyperの2つのパッケージをインストールする。
ターミナルにてRStudioで使用するPythonの仮想環境をアクティベートして、以下のコマンドで事前にインストールしておく。pyperパッケージはcondaではなくpipコマンドでインストールを行う。
まずはターミナルで仮想環境に切り替えてpandasパッケージをインストールする。
% conda activate DSCFA39
% conda install pandas
続いて、pyperパッケージをpipコマンドでインストールする。
% pip install pyper
RのデータフレームをPythonに読み込む
RStudioのPythonのエディタ内で以下のsave_rds関数をPythonで作成する。
import pyper
import pandas as pd
from pathlib import Path, PosixPath
from typing import Union
def save_rds(df: pd.core.frame.DataFrame, file: Union[str, PosixPath]) -> bool:
strfile = str(file)
pathfile = Path(file)
# datetime型があると変換エラーが起こるのでstrにする
df = pd.concat([df.select_dtypes('datetime').astype(str), df.select_dtypes(exclude='datetime')], axis=1)
# PosixPathがあると変換エラーが起こるのでstrにする
df = pd.concat([df.select_dtypes('object').astype(str), df.select_dtypes(exclude='object')], axis=1)
r = pyper.R(use_pandas='True')
r.assign("df", df)
r(f'saveRDS(df, file="{strfile}")')
ret = r.get(f'readRDS("{strfile}")')
if ret is None:
print('Conversion failed')
pathfile.unlink()
return False
else:
return True
引用元:https://qiita.com/takano_tak/items/0be0305c2450dc81736e
上記Pythonスクリプトを実行して、RStudioの環境変数の確認画面で、Pythonにsave_rds関数が登録されていれば実行可能である。
RStudioのWorking directryの設定
上記関数を使用する前に、データフレームのやり取りを行うRおよびPythonのスクリプトを同じフォルダーに置いて、セッションのWorking Directoryを合わせておく。
各スクリプトを同じフォルダーに保存して、Session – Set working Directory のTo Source File Locationをクリックする。
Pythonの環境で、以下のコマンドで出力する。
save_rds(df, "AAAA.RDS")
※ここで、dfは出力したいデータフレームのオブジェクト名、“AAAA.RDS”は区別ができるファイル名を指定する。
R環境で読み込み
Rの環境で、以下のコマンドでRに読み込んでオブジェクトに保存する。
rdf_1 <- readRDS ("AAAA.RDS")
rdf_1
class()関数で読み込んだオブジェクトを確認し、data frameの型であることを確認する。
```Confirm.R
class(rdf_1)
```
class(rdf_1)
[1] "data.frame"
- ここで、rdf_1は任意のオブジェクト名を指定する。
- 後にPythonで読み込む際にはこのオブジェクト名を使用するため、ピリオド(.)などのPythonの動作に支障をきたす特殊文字は使用不可となる。
Rで作成したデータフレームをPythonで読み込む方法
Pythonのエディタ内で、 ”r.” をオブジェクトの前に付けることで、Pythonで読み込むことができる。
py_rdf1 = r.rdf_1