python rpy2_[Manual] python调用R之rpy2使用手册

如果你是第一次阅读这篇文章,以下资源贴可能是你感兴趣的:

为什么要用python调用R,而不选择R调用python呢?一是我可能会需要和别的系统、接口做I/O操作,python显然比R更有优势;二是window系统下不兼容R调用python的rpython包,也有解决办法但没那么简洁好用。

pycharm中安装rpy2

我用的pycharm是PyCharm Community Edition 2017.1.5,利用File->Settings->Project Interpreter安装ry2包(这是一种类似RStudio的安装package方式)的时候一直提示:

Error: Tried to guess R’s HOME but no command ‘R’ in the PATH.

在环境变量里面添加R的安装文档夹bin,在cmd窗口输入R,是可以得到Rterm窗口的。重新打开pycharm,重新安装仍然报错。后来发现这个包可以通过非官方途径安装,下载一个对应的whl文档,在cmd输入pip install "D:R-3.2.1rpy2-2.8.6-cp36-cp36m-win_amd64.whl"(请不要直接复制我的路径),可以顺利安装rpy2包。注意:一定要记住你的包安装的site-packages路径,直到测试rpy2可以正常使用

装好之后在pycharm控制面板运行测试,它又报错(环境变量你站出来背锅):

import rpy2.robjects as robjects

RuntimeError: R_USER not defined.

这个问题在Stack Overflow已经被解决,需要在系统环境变量中添加R的主目录路径,另外需要设置R_HOME和R_USER的新建环境变量。总的安装步骤可以总结为:

下载whl文档,利用wlh文档安装rpy2

设置系统环境变量path和新建环境变量R_HOME和R_USER

python中调用R

有两种思路,一是把需要用到的R语句全部封装到一份或者几份R脚本,利用source(xxx.R)的办法执行R语句。二是把R语句用robjects.xxx逐句逐句包裹好放入python语句中,前者需要把数据从内存导出转换为R语言可以识别的格式,再利用封装的通过测试的R脚本完成剩下的数据分析任务,速度上比较慢,后续分析中出了问题也不容易控制;后者时刻都在python监控之下容错性好,但是代码更加晦涩不容易写。从稳定可控角度考虑,还是应该选择后者,除非数据分析任务十分简单,不易出错。为了更容易使用rpy2,决定封装常用的R函数,使得书写方式更接近R语言语法格式。

rpy2简介

你可以用以下方式查看rpy2的版本

1

2import rpy2

print(rpy2.__version__)

R包导入

导入R包通常是编写R代码的第一部分,rpy2提供了rpy2.robjects.packages.importr()导入R包。

Example1

2

3

4

5

6from rpy2.robjects.packages import importr

base = importr('base')

utils = importr('utils')

单行R代码

在上述命令下,有三种方式可以选择:

使用r.obj,比如 r.c(1, 3)。

这种方法虽然方便,但是对于名称中有“点号”的函数会出问题,比如 data.frame或者 read.csv等。

使用r['obj'],比如 r['c'](1, 3)。

这种方法几乎可以调用任何R的函数,而且写法与原始调用很相似,无非是r['func'](value1, para2 = value2)。

如果一个R函数中的变量名是有“点号”的,不能直接赋值,需要构建一个字典形式,比如 r['func'](value1, para2 = value, **{para.3: value3})。

使用r('obj'),比如r('c(1, 3)')。

这种方法从某种程度上讲是万能的,因为总是可以将任意长度的R代码写成一个Python字符串,之后通过r('Rcode')调用执行。由于对R语言的有一定掌握,我认为这一种表达方式更适合已有的R风格。

多行R代码

更多时候我们需要执行一整段复杂R代码,将每一行R代码嵌入python脚本中非常麻烦,我们往往只需要R中最后的一小部分结果。可以利用python中的'''封装R语句脚本,传入robjects.r( )函数中。

Example1

2

3

4

5

6

7

8

9

10

11robjects.r('''

# create a function `f`

f

if (verbose) {

cat("I am calling f().n")

}

2 * pi * r

}

# call the function `f` with argument value 3

f(3)

''')

在rpy2中创建R向量

创建向量,可以使用rpy2.robjects.vectors中提供的一系列函数,将一个Python的元组、列表或者字符串转换为R的向量。其中包括 StrVector()、IntVector()、FloatVector()、FactorVector()和BoolVector(),分别提供了转换字符、整数、浮点、因子和布尔向量。

创建列表,可以使用ListVector()将Python的字典转换为R的列表。

创建矩阵和数据框(data.frame)建议直接使用R函数matrix()和data.frame()。尽管如此,rpy2提供了DataFram()将Python的字典转换成R的数据框(列顺序可能与输入不一致,Python字典特性造成),注意会把字符串自动转换成因子。

以上这些构建的R对象,有一系列的属性和方法,比如names,可以访问和赋值。

1

2

3

4

5

6

7

8res = robjects.StrVector(['abc', 'def'])

print(res.r_repr())

res = robjects.IntVector([1, 2, 3])

print(res.r_repr())

res = robjects.FloatVector([1.1, 2.2, 3.3])

print(res.r_repr())

R中的矩阵只是含有维度属性的向量(vectors),可以用以下方式生成:

1

2

3robjects.r('v=c(1.1, 2.2, 3.3, 4.4, 5.5, 6.6)')

m = robjects.r('matrix(v, nrow = 2)')

print(m)

绘图1

2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值