rpy2 学习笔记

rpy2包信息

rpy2是由C语言编写的,便于在Python中调用R语言功能的函数包。rpy2包信息可由下列命令得到:

import rpy2
print(rpy2.__version__)

注意:rpy2到目前为止有2.9.x, 3.0.x, 3.1.x, 3.2.x, 3.3.x, 3.4.x版本,各版本存在差异,若发生错误,请注意rpy2版本信息是否正确。

查看rpy2编译的R语言版本信息

from rpy2.rinterface import R_VERSION_BUILD
print(R_VERSION_BUILD)

rpy2提供了两种方式与R语言的交互方式,一种是rpy2.rinterface,另外一种是rpy2.robjects。为了方便之后在Python中顺畅的调用R,因此我主要利用rpy2.robjects这种方式。

from rpy2.robjects import robjects

安装

笔者是利用的conda管理工具安装的rpy2,非常方便。

# 在一个新环境中
conda install rpy2

# conda 只能安装rpy2 == 2.9.x版本,可pip升级为3.4.x版本
pip install rpy2 --upgrade

Import R packages

rpy2可将R语言中的包导入,并且赋给python中的一个变量

from rpy2.robjects.packages import importr
# import R's base package
base = importr(base)

# import R's "utils" package
utils = importr(utils

此时,R语言中的包就成了python中的一个对象

Installing R packages

1.镜像源安装

在python中安装R packages是重要的一步,你可以直接从R包仓库或者本地安装R包。

# import R package module
import rpy2.robjects.packages as rpackages

# import R utils package
utils = packages.importr('utils')

# select a mirror for R packages
utils.chooseCRANmirror(ind=1) # select the first mirror in the list

我们已经准备好安装第一个包了

# R package names
packages = ('ggplot', 'hexbin')

# R vector of strings
from rpy2.robjects.vectors import StrVector

# Selectively install what needs to be install.
names_to_install = [x for x in packages if not rpackages.isinstalled(x)]
if len(names_to_install):
	utils.install_packages(StrVector(names_to_install))

如何你安装的包是CRAN包,上面部分代码可以作为你python代码的一部分。

更多关于R包处理方法可以在 rpy2文档中找到

2.本地代码导入包

将本地代码以字符串的形式,借助rpy2中的函数导入之rpy2中

# R
square <- function(x) {
    return(x^2)
}

cube <- function(x) {
    return(x^3)
}

在rpy2中可表示成:

from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage

string = """
square <- function(x) {
    return(x^2)
}

cube <- function(x) {
    return(x^3)
}
"""

powerpackage = SignatureTranslatedAnonymousPackage(string, "powerpackage")

R包 squarecube 在rpy2中也可被称为 powerpackage.squarepowerpackage.cube

3.github源码安装

import urllib2
from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage

bioc_url = urllib2.urlopen('https://raw.github.com/hadley/stringr/master/R/c.r')
string = ''.join(bioc_url.readlines())

stringr_c = SignatureTranslatedAnonymousPackage(string, "stringr_c")

可直接从网络上下载源码导入至rpy2的 SignatureTranslatedAnonymousPackage

The r instance

1.Getting R objects

rpy2.objects.r 中的__getitem__() 方法,可以将R对象与一个变量联系起来
例如在R中:

> pi
[1] 3.141593

在rpy2可表示为:

>>> pi = robjects.r.pi
>>> pi[0]

>>> pi = robjects.r['pi']
>>> pi[0]

>>> pi = robjects.r('pi')
>>> pi[0]
3.141592654

注意:pi 是 R 向量 c(3.141592654),要想或者 pi 的数值,需要添加[0]

robjects.r() 可以将括号内的内容当作字符串,在R环境中运行。在多种python与R代码传递过程中,选择robjects.r(‘xxx’)的方式,此种方式不会报错。

2.R语言环境变量

将对象存储在python变量中,可防止对象对当作垃圾回收。

>>> robjects.globalenv('foo') = 1.2
>>> foo = robjects.r('foo')
>>> foo[0]
1.2

然后我们将foo 对象从R环境变量中删除

>>> robjects.r('rm')('foo')
>>>robjects.r('foo')
LookupError: 'foo' not found

python 变量foo仍然可以使用

>>> foo[0]
1.2

类似与其他语言,R语言也存在全局环境变量与局部环境变量。在rpy2中可表示为:

robjects.globalenv, robjects.local_context

R 和 pandas data frame转换

在作者所使用的rpy2 3.4.x版本中,支持R语言的data.frame与pandas的data frame相互转换的功能。

R向量与numpy转换

numpy to rpy2

import numpy as np
import rpy2.robjects.numpy2ri

from rpy2.robjects import r
rpy2.robjects.numpy2ri.activate()

data = np.random.random((10,10))
r.heatmap(data)

rpy2 to numpy

import rpy2

x = [1,2,3,4,1,2,3,4,1,2]

v = rpy2.robjects.FloatVector(x)

c = np.array(v)

R data.frame 与 pandas data frame转换

From pandas data frame to R data.frame

import pandas as pd
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri

from rpy2.robjects.conversion import localconverter

pd_df = pd.DataFrame({'int_values': [1,2,3],
                      'str_values': ['abc', 'def', 'ghi']})

with localconverter(ro.default_converter + pandas2ri.converter):
    r_from_pd_df = ro.conversion.py2rpy(pd_df)

r_from_pd_df

From R data.frame to pandas data frame

import pandas as pd
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri

from rpy2.robjects.conversion import localconverter

r_df = ro.DataFrame({'int_values': ro.IntVector([1,2,3]),
                     'str_values': ro.StrVector(['abc', 'def', 'ghi'])})

with localconverter(ro.default_converter + pandas2ri.converter):
 	pd_from_r_df = ro.conversion.rpy2py(r_df)

pd_from_r_df

[1] rpy2官方文档:https://rpy2.github.io/doc/v3.4.x/html/getting-started.html

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值