转载:http://ices01.sinaapp.com/?p=129   
   
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互通的第三方包也大大的有。
   
最后我选择第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对象来支持使用”.”来访问带名字空间的对象和函数。更多的知识,请移步官方文档

让R与Python共舞的更多相关文章

  1. [转] 与调试器共舞 - LLDB 的华尔兹

    你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNu ...

  2. 与调试器共舞 - LLDB 的华尔兹

    你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? 1 NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? 1 ...

  3. Data manipulation primitives in R and Python

    Data manipulation primitives in R and Python Both R and Python are incredibly good tools to manipula ...

  4. 做量化模型Matlab、R、Python、F#和C++到底选择哪一个?

    MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室).是由美国mathworks公司发布的主要面对科学计算.可视化以及交互式程序设计的高科技计算环境.它将数 ...

  5. 与中国最顶尖sharepoint工程师共舞

    最近又跳了,来到某家外企.自以为善能称心如意,谁知乃井里之蛙. 给我的最大感触是,做sharepoint一定要做过非常大型的部署开发,没有经过这种淬炼,天天闷声研究,做一些页面功能,对技术提升毫无帮助 ...

  6. R 调用 python

    上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python.R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如 ...

  7. 四大机器学习编程语言对比:R、Python、MATLAB、Octave

    本文作者是一位机器学习工程师,他比较了四种机器学习编程语言(工具):R.Python.MATLAB 和 OCTAVE.作者列出了这些语言(工具)的优缺点,希望对想开始学习它们的人有用. 图源:Pixa ...

  8. R和Python,对抗or融合?

    来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...

  9. R vs Python,数据分析中谁与争锋?

    R和Python两者谁更适合数据分析领域?在某些特定情况下谁会更有优势?还是一个天生在各方面都比另一个更好? 当我们想要选择一种编程语言进行数据分析时,相信大多数人都会想到R和Python——但是从这 ...

随机推荐

  1. 学Python Django学得很迷茫,怎么办?-转自知乎

    本人学生,零编程基础,在学习python的过程中越学越迷茫,感觉像无头苍蝇一样,来知乎取经,下面进入正题吧:        我是先看了中谷的python教学视频,然后跟着慕课网上的python教程把题 ...

  2. BZOJ4033:[HAOI2015]树上染色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4033 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将 ...

  3. Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码

    Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...

  4. 谷哥的小弟学前端(01)——HTML常用标签(1)

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...

  5. bzoj2054: 疯狂的馒头(并查集)

    每个区间只被覆盖一次,求每个点被哪种区间覆盖或者某个区间是否已经被覆盖过都可以用并查集做. 做法:每个点都指向当前被覆盖区间的右端点+1的位置,某个点的下一个没被覆盖的点是gf(i),同理如果某个区间 ...

  6. 音视频处理之H264编码标准20170906

    一. H264基础概念 1.名词解释 场和帧 :    视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片:             每个图象中,若干 ...

  7. Python高级语法总结

    1.Python面向对象 创建类 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例: class ClassName: '类的帮助信息' #类文档字符串 class_s ...

  8. [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost' (using password: YES)

    在配置了zabbix服务端后,发现:“zabbix server is running”的Value值是“no”, 用:netstat -atnlp|grep 10051 发现没有出现zabbix_s ...

  9. REST式的web服务

    “REST”是罗伊·菲尔丁(Roy Fielding)在他的博士论文中创造的缩写.菲尔丁论文的第5章勾画出了被称为REST风格或REST式的Web服务的知道原则.他是HTTP1.1规范的主要作者和Ap ...

  10. AJAX 状态值与状态码详解

    1- AJAX状态值与状态码区别 AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互 ...