我们在使用python进行数据分析时 ,有时会遇到这样的情况:
python没有现成的包,但是R语言有,使用R包获得的结果是 .RData数据;又或者我们需要用到 .RData 格式的开源数据。
此时我们就面临着将.RData的数据导入python进行后续分析的场景。
这篇文章将完整讲述如何将.RData的数据导入python,以及如何在python中简单调用R的接口。
整篇文章将分为两部分:
- 安装rpy2 及注意细节
- .RData 数据导入python,转化成dataframe,numpy array,dict
1.安装rpy2 及注意细节:
python 读.RData数据的包有两个:rpy2 和 pyreadr。
- pyreadr 提供了四个函数,可以对一些简单的RData 和 python 数据之间进行转换,如 下图。但是如果你需要导入的数据并非以下格式,如list,array等,请考虑使用rpy2。
- rpy2 提供了非常多调用R语言的接口,在这篇文章中仅介绍导入.RData数据相关的一部分。
1.下载rpy2 (存在编译环境)
安装命令:
pip install rpy2
2.下载并安装对应的轮子.whl文件(无编译环境,新手推荐)[1]
许多第三方包需要预编译,whl文件可以理解为已经编译好,直接能用的第三方包。
如果没有安装wheel,先需要用pip安装wheel
pip install wheel
然后下载rpy2.whl:rpy2.whl文件下载地址
进入命令行,在.whl文件对应目录下,输入安装命令:
pip3 install rpy2-2.9.5-cp37-cp37m-win_amd64.whl
注意事项:需要下载与python版本,window版本对应的.whl文件。如截图所示为python3.7,win64位系统。
3.添加系统环境变量:
变量名为:R_HOME, R_USER
变量值:R 语言安装路径
注意事项:添加系统变量而非用户变量,使用pycharm等IDE时,只能读到系统变量。
4.测试rpy2是否安装成功
import
2. .RData 数据导入python
import rpy2.robjects as robjects
import numpy as np
robjects.r['load']("yourfile.Rdata")
.RData文件相当于R语言的workspace,包含了多个变量,通过上面的代码就把.RData中所有变量导入到了robjects里面了。
- [2]如果你的数据是dataframe,例如叫d,你可以很方便的用columns和rows进行索引
>>> 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]
- 如果你的数据是matrix 或者array,例如变量名叫a
a = robjects.r['a']
print(type(a))
a = np.array(a)
print(type(a))
print(a.shape)
- [3]如果你的数据是list,list中元素有名称,实际上跟python的中dictionary没什么区别,可以使用names索引元素,可以使用代码转化,如下:
def as_dict(vector):
"""Convert an RPy2 ListVector to a Python dict"""
result = {}
for i, name in enumerate(vector.names):
if isinstance(vector[i], robjects.ListVector):
result[name] = as_dict(vector[i])
elif len(vector[i]) == 1:
result[name] = vector[i][0]
else:
result[name] = vector[i]
return result
参考
- ^https://www.cnblogs.com/lyrichu/p/6819079.html
- ^参考文章:Loading .RData files into Python https://stackoverflow.com/questions/21288133/loading-rdata-files-into-python
- ^参考文章:Converting an RPy2 ListVector to a Python dictionary https://stackoverflow.com/questions/24152160/converting-an-rpy2-listvector-to-a-python-dictionary