让Python与R翩翩共舞

R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展示 工具。通俗点说,R是用来作统计和画图的。R拥有本身的脚本语言和大量的统计、图形库(得益于开源社区),这让她看起来既美又实用。与其余同类软件(如 SPSS)相比,R的特色是纯命令行的,这倒也好,咱们更应该把注意力放在数据自己,而非统计工具的UI。
   
R虽然说有一套本身的语言,还挺完备,但她最专业的仍是作统计和画图,而像链接数据库、文本处理、文件操做等这些脏活可不能委屈R来干哪,这些得有其 他语言来负责,个人选择是咱最熟悉的、作这些脏活最棒的Python。那接下来的问题很清楚了,R和Python如何一块儿工做?拍拍脑壳,想到可能有下面 几种办法:

   
1. R和Python只共享文件,Python把源数据处理干净,生成格式化的文件放在预约的目录下,作个定时器让R去读文件,最终输出统计结果和图表。

   
这种作法必定程度上可行,除了作定时器外,还可让Python即时执行”rscript”命令调用R脚原本工做,只是这种办法限制太大,只可以交换文件,Python不能对R进行精确的控制。

   
2. 让Python直接调用R的函数,R是开源项目,确定会有一些第三方库实现Python与R互通。

   
果真,我找到了rpy2,能够实现使用python读取R的对象、调用R的方法以及Python与R数据结构转换等。实际上除了Python,其余语言与R互通的第三方包也大大的有。
php

采用下面的命令进行安装:
html

sudo pip install rpy2

   
最后我选择第2种方法,来让R与Python共舞。

   
模块 rpy2.robjects 是rpy2对R的一个高级封装,该模块里包含了一个r对象和一系列的R数据结构。使用rpy2的大多数状况,只须要跟这个模块打交道便可。rpy2的安装 在此很少讲了,有兴趣的同窗看文档去,直接体验一下R如何与Python无缝整合吧。
了解r实例r实例是指rpy2.robjects.r,它是在Python中的嵌入式R进程,把r看成从python走向R的通道来看就能够了。经过r实例,咱们能够读取R的内置变量、调用R的函数、甚至,直接把它看成R的解析器来用。

   
访问R的对象在R的命令行中,咱们直接输入对象名来访问R的内置对象,如pi、letters:

   
在R控制台中访问R对象

而使用r实例,python访问R对象也很简单,并且方法不少:
在python中访问R对象

在这段代码中,咱们用了三种方式来访问R对象,把r实例看成字典,把r实例看成方法,把r实例当 做一个类对象(真是神喻呀~)。在实际中,使用哪种方式要因习惯而异,我喜欢的方法是使用第三种,把r实例看成本身人,直接使用”.”来访问R对象。但 这种方法有一个缺陷,就是不能访问带名字空间的R对象或函数,而其余两种方式是能够的,这点将在随后说明。
调用R函数经过r实例,咱们能够轻易地实现用Python调用R的函数。下面咱们分别在R控制台和python命令行下读一个数据文件并画一张点图。
R控制台读取文件画点图

代码解读:
data.csv 的内容就是上面代码的3到7的内容。
data = read.table(‘data.csv’) :把文件读进一个数据框变量data中。
mtx = data.matrix(data):把data转变成矩阵。
dotchart(mtx)用矩阵的数据画点图。
结果以下:

接下来用python来作一遍一样的事情,咱们以前了解到,使用r实例能够直接访问R对象,还可 以直接调用R的函数,其实在Python看来,对象和函数是相同的东西,函数也是一种对象罢了。如今来试一下调用”read.table()”函数读入一 个数据文件data.csv:

出错了!怎么回事?在上面我提到过了,使用“.”引用的方式不能访问带有名字空间的R对象和函数,read.table 是表示在read包下面的table函数,经过”.”的形式调用失败,必需要用字典的方式或参数的方式来得到:

这段代码获得的结果与在R控制台下画点图的效果是同样的。最后一行 r.dotchart(mtx)是直接经过”.”来调用R的函数dotchart的,在没有名实空间的状况下,是正常的。若是你为了不太多不可控制的出 错机会,你能够统一地使用字典的方式来访问R对象和方法,这是最保险的方法,虽然我我的认为看起来有点别扭。

   
r实例就是一R控制台其实r实例就是一个可交互的R控制台,只不过交互对象是Python与R罢了,为了证实r实例具备R控制台的特性,来作个实验,写一串R脚本,做为Python一个字符串变量的内容,把该字符串传给r实例,而后把r实例看成方法来调用:

出来的结果这样:

注意,把r实例看成控制台,只可以经过r(r代码)的方式来使用r实例,字典的方式行不通。

   
加载自定义函数在实际应用中,使用R语言来编写本身的函数一样是不可避免的,在R控制台中,可使用 source(‘script_path’)的方法来加载自定 义R脚本。而在Python中使用本身义R脚本中的函数也一样方便:使用r.source(‘script_path’)便可把自定义函数加载到全局环境 中,再使用r.自定义方法名就能够实现调用,我就是这样作的,在此再也不详述,同窗们本身动手玩一下。

   
R Vector与Python list向量(Vector)是R的一个最重要的也是最经常使用的数据类型,能够理解为 一个二维数据,对应Python的list。在R控制台中,声明一个变 量:“x <- 1”,X会被声明成一个向量,而其第一个值是1。R经常用c()函数来声建立一个由多个值组成的向量,例如c(1,2,3,4)。Python要与R打交 道,除了访问R对象和调用R函数,还有就是要学会如何转换常见的数据类型。

   
rpy2提供了几个类,供咱们把Python的list转换成R的Vector。分别是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector为例,将Python的list转换成R的Vector:robjects.IntVector([1,2,3,4,5]),毕!

   
下面来使用刚学到的类型转换知识画上一个例子的散点图来结束这次体验:

还在继续…..rpy2提供的不只仅是上面这些,上面的知识只是rpy2所提供的20%,可是已经足以解决80%的问题。rpy2还提供了更低级的API,你能够作更多的事情,例如你能够实现另外一个robjects对象来支持使用”.”来访问带名字空间的对象和函数。更多的知识,请移步官方文档

python

相关文章
相关标签/搜索