前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何让R与Python一起工作 | 案例讲解

如何让R与Python一起工作 | 案例讲解

作者头像
1480
发布于 2020-01-16 08:14:31
发布于 2020-01-16 08:14:31
2K00
代码可运行
举报
文章被收录于专栏:数据分析1480数据分析1480
运行总次数:0
代码可运行

R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现工具。通俗点说,R是用来做统计和画图的。R拥有自己的脚本语言和大量的统计、图形库(得益于开源社区),这让她看起来既美又实用。与其他同类软件(如 SPSS)相比,R的特点是纯命令行的,这倒也好,我们更应该把注意力放在数据本身,而非统计工具的UI

R虽说有一套自己的语言,还挺完备,但它最专业的还是做统计和画图,而像连接数据库、文本处理、文件操作等这些脏活可不能委屈R来做,这些得有其他语言来负责,我的选择是咱最熟悉的、做这些脏活最棒的Python。那接下来的问题很清楚了,R和Python如何一起工作?我总结了2个方法来进行操作。

01. R和Python只共享文件

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

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

02. 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对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>pi
[1] 3.141593
> letters
[1]"a"b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q"
[18]"r""s""t""u""v""w""x""y""z"

而使用R实例,python访问R对象也很简单,而且方法很多:

在python中访问R对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>>  from rpy2 import robjects
>>> r. robjects.r
>>> print r['pi']
[1] 3.141593
>>> print r('pi')
[1] 3.141593
>>> print r.pi
[1] 3.141593

在这段代码中,我们用了三种方式来访问R对象,把R实例当作字典、方法及一个类对象。在实际中,使用哪一种方式要因习惯而异,我喜欢的方法是使用第三种,把R实例当作自己人,直接使用”.”来访问R对象。但这种方法有一个缺陷,就是不能访问带名字空间的R对象或函数,而其他两种方式是可以的,这点将在随后说明。

调用R函数

通过R实例,我们可以轻易地实现用Python调用R的函数。下面我们分别在R控制台和python命令行下读一个数据文件并画一张点图。

R控制台读取文件画点图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> data = read. table( 'data.csv')
> data
  total sms gprs
A  10  4  6
B    9  4  5
C    9  4  5
D  10  5  5
> mtx . data. matrix(data)
> dotchart (mtx)

代码解读:

  • 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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> data r. read. table('data.csv')
Traceback  most recent call last):
File "<stdin»", line 1, in cmodule>
File "/Library/python/2.5/site-packages/Il-l.1.7-py2.-macosx-10.6-i386.egg/ init_ ·Py"5.

AttributeError: 'R' object has no attribute ' read'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> data = r['read.table']('data.csv')

>>> data
<RDataFrame - Python: 0x4417601 R: 0x2955dc8>
>>> print data
 total  sms  gprs
A  10  4  6
B    9  4  5
C    9  4  5
D  10  5  5
>>> mtx  r['data matrix'](data)
>>> r. dotchart(mtx)

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

R实例就是一R控制台。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> rscript = """
... x = c(1,3,2,5,4,6)
... plot(x)
... """
>>> r(rscript)
<Robject- Python:0x44f990/R:0x8c63b0>

出来的结果这样:

注意:把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])。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> x = [1,3,2,5,4,6]
>>>  r.plot(robjeats . Intvector(x))
<RObject - Python:0x44f788/R:0x8c63b0>

写在最后

rpy2提供的不仅仅是上面这些,上面的知识只是rpy2所提供的20%,但是已经足以解决80%的问题。rpy2还提供了更低级的API,你可以做更多的事情,例如你可以实现另一个robjects对象来支持使用”.”来访问带名字空间的对象和函数。

End.

作者:Golonger

来源:简书

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据分析1480 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
JAVA多线程详解
分为两种:一类是守护线程,典型是垃圾回收GC;第二类是用户线程,当JVM中都是JVM守护线程,那么当前的JVM将退出。
阮键
2019/08/07
4320
十五、多线程【黑马JavaSE笔记】
假如计算机只有一个CPU,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
啵啵鱼
2022/11/23
2900
十五、多线程【黑马JavaSE笔记】
Java之多线程-------入门
是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。
楠羽
2022/11/18
3760
Java之多线程-------入门
Java 线程与多线程
一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也是性能最高的。
Mirror王宇阳
2020/11/12
1.9K0
java线程详解(史上最全)
根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加QQ群654631948领取下学习资料,面试题,开发工具等,群里有资深java老师做答疑,每天也会有基础部分及架构的直播课,也可以加我的微信renlliang2013做深入沟通,只要是真心想学习Java的人都欢迎。
全栈程序员站长
2022/09/08
2690
java线程详解(史上最全)
多线程详解
假如计算机只有一个CPU,那么CPU在某一时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性的。
秋落雨微凉
2022/10/25
4510
多线程
线程类 Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例 每个线程的作用是 完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码 Java使用线程执行体来代表这段程序流。
JokerDJ
2023/11/27
1950
多线程
JUC 多线程基础
如果一个线程对共享变量的修改,能够被其它线程看到,那么就能说明共享变量在线程之间是可见的。如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。
万能青年
2019/08/30
5300
JUC 多线程基础
第二十四天 多线程-多线程&线程安全【悟空教程】
进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
Java帮帮
2018/07/26
6540
第二十四天 多线程-多线程&线程安全【悟空教程】
Java多线程(全知识点)
概述:本文为Java多线程的基础知识点的第一部分,主要包括,通过继承Thread来实现进程,线程调度,线程控制,run(),start(),join(),sleep(),setDaemon()方法的使用,获取线程名字currentThread(),线程同步,非静态锁,静态方法的锁,Lock锁,生产者与消费者问题,卖票问题。
GeekLiHua
2025/01/21
1410
Java多线程(全知识点)
Java 多线程之 Runnable VS Thread 及其资源共享问题
对于 Java 多线程编程中的 implements Runnable 与 extends Thread,部分同学可能会比较疑惑,它们之间究竟有啥区别和联系呢?他们是不是没啥区别随便选呢?实际中究竟该
用户1177713
2018/02/24
9200
Java 多线程之 Runnable VS Thread 及其资源共享问题
第二十五天 多线程-常用方法&线程池【悟空教程】
System.out.println(getName() + " ==== " + i );
Java帮帮
2018/07/26
3900
第二十五天 多线程-常用方法&线程池【悟空教程】
java_线程、同步、线程池
Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例
咕咕星
2020/08/19
8570
java_线程、同步、线程池
Java-多线程(下)
    线程的同步与死锁是多线程里面最需要重点理解的概念。这种操作的核心问题在于:每一个线程对象轮番强占资源
Java架构师必看
2021/11/11
2500
day18-多线程&线程同步&死锁
在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。
张哥编程
2024/12/13
900
java基础第十六篇之多线程
1:线程的概念 进程(任务):一个正在运行的程序 进程的调度:CPU来决定什么时候该运行哪个进程 (时间片轮流法) 线程在一个应用程序中,同时,有多个不同的执行路径,是进程中的实际运作单位。 好处是提高程序效率。
海仔
2019/08/05
2900
Android多线程:继承Thread类、实现Runnable接口使用教程(含实例讲解)
前言 在Android开发中,多线程的使用十分常见 今天,我将全面解析多线程中最常见的2种用法:继承Thread类 & 实现Runnable接口 Carson带你学多线程系列 基础汇总 Android多线程:基础知识汇总 基础使用 Android多线程:继承Thread类使用(含实例教程) Android多线程:实现Runnable接口使用(含实例教程) 复合使用 Android多线程:AsyncTask使用教程(含实例讲解) Android多线程:AsyncTask的原理及源码分析 A
Carson.Ho
2022/03/25
8290
Android多线程:继承Thread类、实现Runnable接口使用教程(含实例讲解)
【19】JAVASE-多线程专题【从零开始学JAVA】
Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
用户4919348
2024/05/25
1350
【19】JAVASE-多线程专题【从零开始学JAVA】
Java多线程总结(超详细总结)
— JDK 5.0新增 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? 1. call()可以有返回值的。 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息 3. Callable是支持泛型的
小尘要自信
2023/10/10
3140
Java学习笔记之多线程 生产者 消费者
        所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
Jetpropelledsnake21
2022/03/07
6050
Java学习笔记之多线程 生产者 消费者
相关推荐
JAVA多线程详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档