%load_ext sage
# RとPandasのデータフレームを相互に変換する方法
# Sageでは、numpyとpandasをインポート
import pandas as pd
import numpy as np
# Rではjsonliteパッケージを使用
r('library(jsonlite)')
# 例としてR Graphic Cookbookのデータを使用
#r("install.packages('gcookbook')")
r('library(gcookbook)')
[1] "gcookbook" "jsonlite" "stats" "graphics" "grDevices" "utils" "datasets" "methods" [9] "base"
# RからJSON形式でデータを持ってくる方法
# 例として、gcookbookのサンプルデータをRから取得する
test_json = r('toJSON(heightweight, pretty=FALSE)')
# heightweight = pd.read_json(sageobj(test_json)); heightweight.head()
heightweight = pd.read_json(sageobj(test_json)['DATA']); heightweight.head()
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 |
# sageobj(test_json);
# sageobj(test_json)['DATA'];
# これを関数にまとめる
# Rのデータフレームをpandasのデータフレームに変換する
def RDf2PandaDf(name):
json_str = r('toJSON(%s, pretty=FALSE)' % name)
return pd.read_json(sageobj(json_str)['DATA'])
print RDf2PandaDf('heightweight').head()
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
# 同様に関数にまとめる
# pandasのデータフレームをRに渡す
def PandaDf2RDf(df, name):
l = [dict(zip(df.columns, x)) for x in df.values.tolist()]
json_str = str(l)
json_str = json_str.replace("'", '\\"')
r('%s <- fromJSON("%s")' % (name, json_str))
# PandasのデータをRに渡す
age = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
sex = ['F', 'M', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M']
df = pd.DataFrame({'age': age, 'sex': sex}); df.head()
age | sex | |
---|---|---|
0 | 20 | F |
1 | 22 | M |
2 | 25 | M |
3 | 27 | M |
4 | 21 | F |
PandaDf2RDf(df, "a")
r('a')
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