これまで、RのグラフをSageで表示したり、RとSage間でのデータの受け渡しを紹介してきましたが、 Rでもっともよく使われるデータフレームについて、まったく考えていませんでした。
しかし、Pandasの機能が強力であり、とても使えるツールであることからRとPandas間のデータフレーム を相互変換することに挑戦してみます。
また、Rのグラフ表示で使っていたRUtil.pyもPNGファイルベースとして高速化をはかり、ここにデータフレーム の相互変換機能を追加することになりました。
新たに追加したデータフレーム変換関数は、以下の2個です。
データフレーム変換で使用するSageのライブラリーは、pandasとnumpyです。 Rは、jsonliteをパッケージを使用します。
[1] "gcookbook" "jsonlite" "stats" "graphics" "grDevices" "utils" "datasets" "methods" [9] "base" [1] "gcookbook" "jsonlite" "stats" "graphics" "grDevices" "utils" "datasets" "methods" [9] "base" |
RからPandasにデータフレームを変換するために、jsonliteのtoJSONとPandasのread_json関数を使用します。
以下にgcookbookのサンプルデータheightweightをRからPandasのデータフレームに変換する例を示します。
ageMonth ageYear heightIn sex weightLb 0 143 11.92 56.3 f 85.0 1 155 12.92 62.3 f 105.0 2 153 12.75 63.3 f 108.0 3 161 13.42 59.0 f 92.0 4 191 15.92 62.5 f 112.5 [5 rows x 5 columns] ageMonth ageYear heightIn sex weightLb 0 143 11.92 56.3 f 85.0 1 155 12.92 62.3 f 105.0 2 153 12.75 63.3 f 108.0 3 161 13.42 59.0 f 92.0 4 191 15.92 62.5 f 112.5 [5 rows x 5 columns] |
上記の処理をRDfPandasDfという関数にまとめると以下の様になります。
|
RDf2PandasDfを使ってgcookbookのサンプルデータheightweightをRからPandas(Sage) にデータを持ってくる場合の例です。
Rのデータフレーム名をRDf2PandasDfの引数とするとPandasのデータフレームに変換されて返されます。
ageMonth ageYear heightIn sex weightLb 0 143 11.92 56.3 f 85.0 1 155 12.92 62.3 f 105.0 2 153 12.75 63.3 f 108.0 3 161 13.42 59.0 f 92.0 4 191 15.92 62.5 f 112.5 [5 rows x 5 columns] ageMonth ageYear heightIn sex weightLb 0 143 11.92 56.3 f 85.0 1 155 12.92 62.3 f 105.0 2 153 12.75 63.3 f 108.0 3 161 13.42 59.0 f 92.0 4 191 15.92 62.5 f 112.5 [5 rows x 5 columns] |
今度は、逆にPandasのデータフレームをRのデータフレームに変換します。 いろいろ試したのですが、writeJSONを使った変換では上手く処理できず、 もっともオーソドックスなカラム名とデータフレームのvaluesをzipとdictを 使って辞書の配列に変換する方式に行き着きました。
|
年齢と性別のデータフレームをPandasで作成し、それをPandaDf2RDfを使って Rのデータフレームに変換します。
age sex 0 20 F 1 22 M 2 25 M 3 27 M 4 21 F [5 rows x 2 columns] age sex 0 20 F 1 22 M 2 25 M 3 27 M 4 21 F [5 rows x 2 columns] |
PandaDf2RDfの引数は、変換するデータフレームとRでのデータフレーム変数名です。
以下の例では、上記で作成したdfをRのデータフレームに変換し、aという変数にセットし、 それをSageのr関数を使って表示しています。きちんと変換できているのが確認できます。
age sex 1 20 F 2 22 M 3 25 M 4 27 M 5 21 F 6 23 M 7 37 F 8 31 M 9 61 F 10 45 M 11 41 F 12 32 M age sex 1 20 F 2 22 M 3 25 M 4 27 M 5 21 F 6 23 M 7 37 F 8 31 M 9 61 F 10 45 M 11 41 F 12 32 M |
|