52

我有一堆 .RData 时间序列文件,想将它们直接加载到 Python 中,而无需先将文件转换为其他扩展名(例如 .csv)。关于实现这一目标的最佳方法的任何想法?

4

6 回答 6

67

对于那些不想安装 R 来完成此任务(r2py 需要它)的人来说,作为替代方案,有一个新的包“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

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

于 2018-12-27T15:59:01.390 回答
35

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

我认为唯一合理的方法是安装 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 是一个数据框,我可以子集获取列:

>>> 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]
于 2014-01-22T16:14:12.690 回答
8

Jupyter 笔记本用户

如果您使用的是 Jupyter notebook,则需要执行 2 个步骤:

第 1 步:访问http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2并下载 R 语言的 Python 接口(嵌入式 R),我将使用rpy2-2.8.6-cp36-cp36m-win_amd64.whl

将此文件放在您当前所在的同一工作目录中。

第 2 步:转到您的 Jupyter 笔记本并编写以下命令

# 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')
于 2017-09-07T10:04:47.803 回答
6

好吧,几年前我和你有同样的问题。我想.RData从我正在开发的库中读取文件。我考虑过使用 RPy2,但这会迫使我使用 GPL 许可证发布我的库,而我不想这样做。

那时甚至不存在“pyreadr”。此外,我想要加载的数据集不是标准格式的data.frame.

我来到这个问题并阅读了 Spacedman 的答案。特别是,我看到了这条线

所以任何其他语言的任何其他实现都是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

于 2020-09-20T18:37:11.107 回答
2

有一个名为 的第三方库rpy,您可以使用该库来加载.RData文件。你可以通过pip安装来获得它pip instally rpy,如果你没有rpy,那么我建议你看看如何安装它。否则,您可以简单地执行以下操作:

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

编辑:

看起来我在那里有点老派,现在是 rpy2,所以你可以使用它。

于 2014-01-22T16:14:29.700 回答
0

试试这个

!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()

完毕!!

于 2021-03-06T11:07:09.353 回答