如何将R的.rdata文件加载到Python中?

6

我正在尝试将 R 代码的一部分转换为 Python。在这个过程中,我遇到了一些问题。

下面是我的 R 代码。在这里,我将 R 的输出保存为 .rdata 格式。

nms <- names(mtcars)
save(nms,file="mtcars_nms.rdata")

现在我需要将mtcars_nms.rdata加载到Python中。我导入了rpy2模块,然后尝试将文件加载到Python工作区中,但是无法看到实际的输出。
我使用以下Python代码来导入.rdata文件。
import pandas as pd
from rpy2.robjects import r,pandas2ri
pandas2ri.activate()

robj = r.load('mtcars_nms.rdata')
robj

我的Python输出结果是:

R object with classes: ('character',) mapped to:
<StrVector - Python:0x000001A5B9E5A288 / R:0x000001A5B9E91678>
['mtcars_nms']

现在我的目标是从mtcars_nms中提取信息。 在R中,我们可以通过使用 ...来实现此目标。
load("mtcars_nms.rdata");
get('mtcars_nms')

现在我想在Python中做同样的事情。

3个回答

12

有一个新的Python包pyreadr,可以轻松地将RData和Rds文件导入到Python中:

import pyreadr

result = pyreadr.read_r('mtcars_nms.rdata')

mtcars = result['mtcars_nms']

它不依赖于已安装的R或其他外部依赖项。它是C库librdata的封装,因此非常快速。

您可以使用pip非常轻松地安装它:

pip install pyreadr

这个仓库在这里:https://github.com/ofajardo/pyreadr

声明:我是开发人员。


嗨,当我尝试加载大小为700M的.rdata时,会出现以下错误:ValueError: Unable to allocate memory。 - jmir
嗨,感谢尝试使用这个包!一个700 M的RData文件非常大!你是否有足够的RAM?请考虑到RData高度压缩。例如,我有一个40 M的RData文件,如果我将其保存为CSV,则需要450 M,因此增加了11倍。如果你将其加载到R中,它会占用1.3 Gb的内存!而在Python中加载需要1.8 Gb的内存!这意味着如果你有一个700 Mb的RData文件,你至少需要32 Gb的RAM!而且这还很紧张,因为这个过程需要更多的RAM。我认为你至少需要64 GB RAM左右。 - Otto Fajardo
在librdata C库中,数据框架中向量所能包含的最大字节数有一个硬编码限制。它曾经是224字节,意味着222个整数或221个双精度浮点数,这相对较低。如果一个向量包含的字节数超过了这个限制,就会引发内存错误。在最新版本中,这个限制已经增加到232字节,意味着230个整数或229个双精度浮点数,应该足够实际使用了。 - Otto Fajardo

3

建议使用feather而不是使用.rdata格式,这样可以在R和Python之间高效地共享数据。

在R中,您可以运行以下命令:

library(feather)
write_feather(nms, "mtcars_nms.feather")

在Python中,要将数据加载到pandas数据框中,您可以简单地运行以下代码:
import pandas as pd
nms = pd.read_feather("mtcars_nms.feather")

0

R函数load将返回一个R向量,其中包含已加载的对象的名称(加载到GlobalEnv中)。

在rpy2中,您需要做的基本上与在R中所做的相同:

R:

get('mtcars_nms')

Python/rpy2

robjects.globalenv['mtcars_nms']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接