これは初心者の質問ですが、rpy2を使用して2d numpy配列を(圧縮された)R形式のファイルにどのように保存しますか?明確にするために、rpy2に保存してから、後でRを使用して読みたいと思います。データ量が多くなるため、csvは避けたいと思います。
質問する
4629 次
4 に答える
6
save コマンドが必要なようです。pandas R インターフェイスを使用して、次のようなことを行います。
import numpy as np
from rpy2.robjects import r
import pandas.rpy.common as com
from pandas import DataFrame
a = np.array([range(5), range(5)])
df = DataFrame(a)
df = com.convert_to_r_dataframe(df)
r.assign("foo", df)
r("save(foo, file='here.gzip', compress=TRUE)")
ただし、もっとエレガントな方法があるかもしれません。私はより良い提案を受け入れます。上記の inR
が使用されます。
> load("here.gzip")
> foo
X0 X1 X2 X3 X4
0 0 1 2 3 4
1 0 1 2 3 4
の使用をバイパスしてからnumpy2ripandas
を使用できます。次のようなもので:rpy2
from rpy2.robjects import r
from rpy2.robjects.numpy2ri import numpy2ri
a = np.array([[i*2147483647**2 for i in range(5)], range(5)], dtype="uint64")
a = np.array(a, dtype="float64") # <- convert to double precision numeric since R doesn't have unsigned ints
ro = numpy2ri(a)
r.assign("bar", ro)
r("save(bar, file='another.gzip', compress=TRUE)")
次にR
:
> load("another.gzip")
> bar
[,1] [,2] [,3] [,4] [,5]
[1,] 0 4.611686e+18 9.223372e+18 1.383506e+19 1.844674e+19
[2,] 0 1.000000e+00 2.000000e+00 3.000000e+00 4.000000e+00
于 2012-07-20T20:41:03.890 に答える
2
これは、列と行の名前を追加するパンダのない例です
import numpy as np
from rpy2.robjects import rinterface, r, IntVector, FloatVector, StrVector
# older (<2.1) versions of rpy2 have globenEvn vs globalenv
# let's fix it a little
if not hasattr(rinterface,'globalenv'):
warnings.warn('Old version of rpy2 detected')
rinterface.globalenv = rinterface.globalEnv
var_name = 'r_var'
vals = np.arange(20,dtype='float').reshape(4,5)
# transpose because R is column major vs python is row major
r_vals = FloatVector(vals.T.ravel())
# make it a matrix
rinterface.globalenv[var_name]=r['matrix'](r_vals,nrow=vals.shape[0])
# give it some row and column names
r("rownames(%s) <- c%s"%(var_name,tuple('ABCDEF'[i] for i in range(vals.shape[0]))))
r("colnames(%s) <- c%s"%(var_name,tuple(range(vals.shape[1]))))
#save it to file
r.save(var_name,file='r_from_py.rdata')
于 2012-07-20T21:41:03.803 に答える