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包 square 和 cube 在rpy2中也可被称为 powerpackage.square 和 powerpackage.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