我有一堆.RData时间序列文件,并希望直接将它们加载到Python中,而无需先将文件转换为其他扩展名(例如.csv)。有关实现这一目标的最佳方法的任何想法吗?
答案 0 :(得分:24)
人们在R-help和R-dev列表中询问这类事情,通常的答案是代码是.RData
文件格式的文档。因此,任何其他语言的任何其他实现都是 hard ++ 。
我认为唯一合理的方法是安装RPy2并使用R的load
函数,然后转换为适当的python对象。 .RData
文件可以包含结构化对象以及普通表,因此请注意。
Linky:http://rpy.sourceforge.net/rpy2/doc-2.4/html/
Quicky:
>>> 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]
答案 1 :(得分:7)
对于那些不想为了完成此任务而不必安装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
免责声明:我是该软件包的开发人员。
答案 2 :(得分:6)
如果您使用的是Jupyter笔记本,则需要执行两个步骤:
步骤1:转到http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2并将Python界面下载到R语言(嵌入式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')
答案 3 :(得分:2)
有一个名为rpy
的第三方库,您可以使用此库加载.RData
个文件。您可以通过pip
安装pip instally rpy
获取此功能,如果您没有rpy
,那么我建议您查看如何安装它。否则,你可以简单地做:
from rpy import *
r.load("file name here")
我觉得我现在有点老了,现在是rpy2,所以你可以使用它。
答案 4 :(得分:1)
好吧,几年前,我和你有同样的问题。我想从我正在开发的库中读取.RData
文件。我考虑过使用RPy2,但这将迫使我使用GPL许可证释放我的库,而我不想这样做。
“ pyreadr”当时甚至不存在。另外,我要加载的数据集不是data.frame
的标准化格式。
我遇到了这个问题,读了Spacedman answer。特别是我看到的线
因此,任何其他语言的其他实现都是很难的++。
面临挑战,因此在几天之内实施了rdata软件包。这是.RData
解析器和转换器的非常小的纯Python实现,能够满足我的需求。解析原始对象并将其转换为适当的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.])}
正如我所说,我已经开发了此软件包,并且自从使用以来一直没有问题,但是由于没有正确记录它,所以我没有去麻烦它。这最近发生了变化,现在文档大部分都可以了,所以这里适合任何有兴趣的人:
答案 5 :(得分: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()
完成!!