将 .RData 文件加载到 Python 中

64
我有一堆.RData时间序列文件,想直接将它们加载到Python中,而不需要先将文件转换为其他扩展名(如.csv)。 有什么好的方法可以实现这一点吗?
7个回答

90

对于那些不想安装R也能完成这个任务(r2py需要R)的人,有一个新的包“pyreadr”,它允许在不需要任何依赖的情况下直接将RData和Rds文件读入python。

它是C库librdata的包装器,因此非常快速。

您可以使用pip轻松安装:

pip install pyreadr

举个例子,你会这样做:

import pyreadr

result = pyreadr.read_r('/path/to/file.RData') # also works for Rds

# done! let's see what we got
# result is a dictionary where keys are the name of objects and the values python
# objects
print(result.keys()) # let's check what objects we got
df1 = result["df1"] # extract the pandas data frame for object df1

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

免责声明:我是这个软件包的开发者。


2
关键错误:'df1' - rsc05
3
你好,我在 Python 3.7.6 中遇到了困难。我使用 pip install readrconda install -c conda-forge pyreadr 安装了相关依赖。我已经成功将 RData 导入 Python 中,但是我无法访问其中的数据。即使是一个基本的 3x2 的 RData 文件,df.keys() 返回的也是 odict_keys([None])。是 Python 还是 R 发生了一些变化需要更新,还是我漏掉了什么? - gmarais
当我尝试读取一个.RData文件时,出现了错误LibrdataError: Unable to convert string to the requested encoding。不同的.RData文件可以正常工作,但是我需要的数据格式的文件无法加载,真是让人费解!这种情况发生的常见原因有哪些? - AcidCatfish
1
现在 pyreadr 只能处理以 UTF-8 格式保存的文件。你的文件可能是其他编码格式。关于这个错误在 Github 上有一个问题已经被公开讨论了。 - Otto Fajardo
你介意看一下这里吗?https://stackoverflow.com/questions/72702702/batching-large-rfiles-in-pyreadr 谢谢。 - Tomasz Kania
显示剩余2条评论

38

人们在 R-help 和 R-dev 列表上问这种问题,通常的答案是代码是 .RData 文件格式的文档。因此,在任何其他语言中实现它都很难。

我认为唯一合理的方法是安装 RPy2 并从中使用 R 的 load 函数,同时将其转换为适当的 Python 对象。注意,.RData 文件可以包含结构化对象以及普通表格。

链接:http://rpy.sourceforge.net/rpy2/doc-2.4/html/

快速:

>>> import rpy2.robjects as robjects
>>> robjects.r['load'](".RData")

对象现在已经加载到 R 工作空间中。

>>> robjects.r['y']
<FloatVector - Python:0x24c6560 / R:0xf1f0e0>
[0.763684, 0.086314, 0.617097, ..., 0.443631, 0.281865, 0.839317]
那是一个简单的标量,d是一个数据框,我可以通过子集获取列:

那是一个简单的标量,d是一个数据框,我可以通过子集获取列:

>>> robjects.r['d'][0]
<IntVector - Python:0x24c9248 / R:0xbbc6c0>
[       1,        2,        3, ...,        8,        9,       10]
>>> robjects.r['d'][1]
<FloatVector - Python:0x24c93b0 / R:0xf1f230>
[0.975648, 0.597036, 0.254840, ..., 0.891975, 0.824879, 0.870136]

有一个有用的注释要补充:通常您会想在Numpy中操作这些对象,因此我会添加以下内容:from rpy2.robjects import numpy2ri 然后 numpy2ri.ri2numpy(r['d'])。然后您就可以以“Pythonic”的方式操作Numpy数组了。 - jonathanrocher
@jonathanrocher 看起来现在(numpy 1.11.1)你只需要执行 np.array( r['d'] ),而我在 numpy2ri 中不再需要 ri2numpy - daknowles
1
注意:文档现在托管在GitHub上:https://rpy2.github.io/doc/latest/html/(当前链接无法使用) - krassowski

9

Jupyter Notebook 用户

如果您正在使用 Jupyter Notebook,您需要执行以下两个步骤:

步骤 1:前往http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2并下载 Python 接口到 R 语言(嵌入式 R)。在我的情况下,我将使用 rpy2-2.8.6-cp36-cp36m-win_amd64.whl 这个文件。

把这个文件放在当前的工作目录中。

步骤 2:进入您的 Jupyter Notebook 并输入以下命令。

# This is to install rpy2 library in Anaconda
!pip install rpy2-2.8.6-cp36-cp36m-win_amd64.whl

然后

# This is important if you will be using rpy2
import os
os.environ['R_USER'] = 'D:\Anaconda3\Lib\site-packages\rpy2'

然后

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

这将允许您在Python中使用R函数。现在,您必须按照以下方式导入readRDS

readRDS = robjects.r['readRDS']
df = readRDS('Data1.rds')
df = pandas2ri.ri2py(df)
df.head()

恭喜您!现在您拥有了想要的数据框。但是,我建议您将其保存在pickle文件中以供稍后在Python中使用,方法是:
 df.to_pickle('Data1') 

下次您可以直接使用以下方式:
df1=pd.read_pickle('Data1')

9

我几年前遇到了和你一样的问题。我想要读取我的一个开发库中的 .RData 文件。我考虑使用 RPy2,但这将迫使我使用 GPL 许可证发布我的库,而我不想这样做。

那时 "pyreadr" 还不存在。此外,我想要加载的数据集并没有像 data.frame 一样具有标准化格式。

我看到了Spacedman 的答案,特别是其中的一行:

So any other implementation in any other language is hard++.

作为一种挑战,我在几天内实现了rdata 包。这是一个非常小的纯 Python 实现的 .RData 解析器和转换器,可以满足我到现在为止的需求。将原始对象解析并转换为适当的 Python 对象的步骤是分开的,因此用户可以使用不同的转换方法。此外,用户可以添加自定义 R 类的构造函数。

这是一个用法示例:

>>> import rdata

>>> parsed = rdata.parser.parse_file(rdata.TESTDATA_PATH / "test_vector.rda")
>>> converted = rdata.conversion.convert(parsed)
>>> converted
{'test_vector': array([1., 2., 3.])}

正如我所说,我开发了这个包并且一直在使用中没有遇到问题,但是我没有花时间为它提高可见性,因为我没有恰当地记录文档。最近这种情况已经改变,现在文档基本上还不错,所以对于任何有兴趣的人,这里是链接:

https://github.com/vnmabus/rdata


没有太多的开销,对我很有效。你应该得到双倍的赞 :) - Zeel B Patel
我认为“hard++”评论是指,由于代码(在R中)是定义,因此定义随时可能会更改。感谢(并点赞)编写该库,但我希望您对官方R文档进行了广泛的测试套件。 - Ketil Malde
1
我有测试加载所有主要类型的R对象,我(和其他人)持续使用它来加载非平凡数据集。到目前为止,我还没有发现无法加载的数据集,但如果有人发现任何问题,我会及时接受并进行审核。 - Mabus

2

有一个第三方库叫做 rpy,你可以使用这个库来加载 .RData 文件。你可以通过 pip install 命令来安装它:pip install rpy。如果你还没有安装 rpy,那么我建议你先了解一下如何安装它。否则,你可以直接执行以下命令:

from rpy import *
r.load("file name here")

编辑:

看起来我有些过时了,现在有rpy2可以使用。


2
还在使用 rpy 吗?那很棒。 - Brandon Bertelsen
@Stu 如果这篇回答对你有帮助,请考虑接受答案 - Games Brainiac

1

@rsc05的回答适用于笔记本用户,对我有用,但显然其中一个函数[df = pandas2ri.ri2py(df)]已被弃用,现在应该是df = pandas2ri.rpy2py(df)

因此,完整的解决方案应该如下:

# import the libraries
>> import rpy2.robjects as robjects
>> from rpy2.robjects import pandas2ri

#activate
>> pandas2ri.activate()

# create readRDS object
>> readRDS = robjects.r['readRDS']

# read .rds using readRDS object
>> df = readRDS('sri_testing_data.rds')

# convert the data into native dataframe object 
>> df = pandas2ri.rpy2py(df)

#print the dataframe
>> df.head()

-1

试试这个

!pip install pyreadr

那么

result = pyreadr.read_r('/content/nGramsLite.RData')

# objects
print(result.keys()) # let's check what objects we got

>>>odict_keys(['ngram1', 'ngram2', 'ngram3', 'ngram4'])

df1 = result["ngram1"]

df1.head()

完成了!


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