3

这是一个初学者的问题,但是如何使用 rpy2 将 2d numpy 数组保存到(压缩)R 格式的文件中?需要明确的是,我想将其保存在 rpy2 中,然后使用 R 读取它。我想避免使用 csv,因为数据量会很大。

4

4 回答 4

6

看起来你想要保存命令。我会使用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

您可以绕过使用pandas和使用numpy2rirpy2. 有类似的东西:

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 回答
3

假设您有一个名为 data 的数据框,那么下面的代码帮助我将此数据作为矩阵存储在 R 中,然后将其加载到 R(R 工作室)

将数据保存到 R

# Take only the values of the dataframe
B=data.values

import rpy2.robjects as ro
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()

nr,nc = B.shape
Br = ro.r.matrix(B, nrow=nr, ncol=nc)

ro.r.assign("B", Br)
ro.r("save(B, file='here.Rdata')")

然后去 R 写这个

load("D:/.../here.Rdata")

这为我完成了工作!

于 2017-09-27T19:26:30.037 回答
2

这是一个没有 pandas 的示例,它添加了列名和行名

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 回答
2

rpy2 的替代方法是编写一个 mat 文件并从 R 加载这个 mat 文件。

在蟒蛇中:

os.chdir("/home/user/proj") #specify a path to save to
import numpy as np
import scipy.io
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
scipy.io.savemat('test.mat', dict(x=x, y=y))

示例复制自: “Converting”Numpy 数组到 Matlab,反之亦然

在 R 中

library(R.matlab)
object_list = readMat("/home/user/proj/test.mat")

我是python的初学者。

于 2014-11-27T18:39:25.120 回答