R(又稱R語言)是一款開源的跨平臺的數(shù)值統(tǒng)計(jì)和數(shù)值圖形化展現(xiàn) 工具糊治。通俗點(diǎn)說,R是用來做統(tǒng)計(jì)和畫圖的罚舱。R擁有自己的腳本語言和大量的統(tǒng)計(jì)井辜、圖形庫(得益于開源社區(qū)),這讓她看起來既美又實(shí)用管闷。與其他同類軟件(如 SPSS)相比粥脚,R的特點(diǎn)是純命令行的,這倒也好包个,我們更應(yīng)該把注意力放在數(shù)據(jù)本身刷允,而非統(tǒng)計(jì)工具的UI。
R雖說有一套自己的語言碧囊,還挺完備树灶,但她最專業(yè)的還是做統(tǒng)計(jì)和畫圖,而像連接數(shù)據(jù)庫糯而、文本處理天通、文件操作等這些臟活可不能委屈R來干哪,這些得有其 他語言來負(fù)責(zé)熄驼,我的選擇是咱最熟悉的像寒、做這些臟活最棒的Python烘豹。那接下來的問題很清楚了,R和Python如何一起工作诺祸?拍拍腦袋吴叶,想到可能有下面 幾種辦法:
1. R和Python只共享文件,Python把源數(shù)據(jù)處理干凈序臂,生成格式化的文件放在預(yù)定的目錄下蚌卤,做個定時器讓R去讀文件,最終輸出統(tǒng)計(jì)結(jié)果和圖表奥秆。
?這種做法一定程度上可行逊彭,除了做定時器外,還可以讓Python即時執(zhí)行”rscript”命令調(diào)用R腳本來工作构订,只是這種辦法限制太大侮叮,只能夠交換文件,Python不能對R進(jìn)行精確的控制悼瘾。
2. 讓Python直接調(diào)用R的函數(shù)囊榜,R是開源項(xiàng)目,肯定會有一些第三方庫實(shí)現(xiàn)Python與R互通亥宿。
?果然卸勺,我找到了rpy2,可以實(shí)現(xiàn)使用python讀取R的對象烫扼、調(diào)用R的方法以及Python與R數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換等曙求。實(shí)際上除了Python,其他語言與R互通的第三方包也大大的有映企。
最后我選擇第2種方法悟狱,來讓R與Python共舞。
模塊 rpy2.robjects 是rpy2對R的一個高級封裝堰氓,該模塊里包含了一個r對象和一系列的R數(shù)據(jù)結(jié)構(gòu)挤渐。使用rpy2的大多數(shù)情況,只需要跟這個模塊打交道即可双絮。rpy2的安裝 在此不多講了浴麻,有興趣的同學(xué)看文檔去,直接體驗(yàn)一下R如何與Python無縫整合吧掷邦。
了解r實(shí)例
r實(shí)例是指rpy2.robjects.r白胀,它是在Python中的嵌入式R進(jìn)程椭赋,把r當(dāng)作從python走向R的通道來看就可以了抚岗。通過r實(shí)例,我們可以讀取R的內(nèi)置變量哪怔、調(diào)用R的函數(shù)宣蔚、甚至向抢,直接把它當(dāng)作R的解析器來用。
訪問R的對象
在R的命令行中胚委,我們直接輸入對象名來訪問R的內(nèi)置對象挟鸠,如pi、letters:
在R控制臺中訪問R對象
而使用r實(shí)例亩冬,python訪問R對象也很簡單艘希,而且方法很多:
在python中訪問R對象:
在這段代碼中,我們用了三種方式來訪問R對象硅急,把r實(shí)例當(dāng)作字典覆享,把r實(shí)例當(dāng)作方法,把r實(shí)例當(dāng) 作一個類對象(真是神喻呀~)营袜。在實(shí)際中撒顿,使用哪一種方式要因習(xí)慣而異,我喜歡的方法是使用第三種荚板,把r實(shí)例當(dāng)作自己人凤壁,直接使用”.”來訪問R對象。但 這種方法有一個缺陷跪另,就是不能訪問帶名字空間的R對象或函數(shù)拧抖,而其他兩種方式是可以的,這點(diǎn)將在隨后說明免绿。
調(diào)用R函數(shù)
通過r實(shí)例徙鱼,我們可以輕易地實(shí)現(xiàn)用Python調(diào)用R的函數(shù)。下面我們分別在R控制臺和python命令行下讀一個數(shù)據(jù)文件并畫一張點(diǎn)圖针姿。
R控制臺讀取文件畫點(diǎn)圖
代碼解讀:
data.csv 的內(nèi)容就是上面代碼的3到7的內(nèi)容袱吆。
data = read.table(‘data.csv’) :把文件讀進(jìn)一個數(shù)據(jù)框變量data中。
mtx = data.matrix(data):把data轉(zhuǎn)變成矩陣距淫。
dotchart(mtx)用矩陣的數(shù)據(jù)畫點(diǎn)圖绞绒。
結(jié)果如下:
接下來用python來做一遍同樣的事情,我們之前了解到榕暇,使用r實(shí)例可以直接訪問R對象蓬衡,還可 以直接調(diào)用R的函數(shù),其實(shí)在Python看來彤枢,對象和函數(shù)是相同的東西狰晚,函數(shù)也是一種對象罷了。現(xiàn)在來試一下調(diào)用”read.table()”函數(shù)讀入一 個數(shù)據(jù)文件data.csv:
出錯了缴啡!怎么回事壁晒?在上面我提到過了,使用“.”引用的方式不能訪問帶有名字空間的R對象和函數(shù)业栅,read.table 是表示在read包下面的table函數(shù)秒咐,通過”.”的形式調(diào)用失敗谬晕,必須要用字典的方式或參數(shù)的方式來獲得:
這段代碼得到的結(jié)果與在R控制臺下畫點(diǎn)圖的效果是一樣的。最后一行 r.dotchart(mtx)是直接通過”.”來調(diào)用R的函數(shù)dotchart的携取,在沒有名實(shí)空間的情況下攒钳,是正常的。如果你為了避免太多不可控制的出 錯機(jī)會雷滋,你可以統(tǒng)一地使用字典的方式來訪問R對象和方法不撑,這是最保險的方法,雖然我個人認(rèn)為看起來有點(diǎn)別扭晤斩。
r實(shí)例就是一R控制臺
其實(shí)r實(shí)例就是一個可交互的R控制臺燎孟,只不過交互對象是Python與R罷了,為了證明r實(shí)例具有R控制臺的特性尸昧,來做個實(shí)驗(yàn)揩页,寫一串R腳本,作為Python一個字符串變量的內(nèi)容烹俗,把該字符串傳給r實(shí)例爆侣,然后把r實(shí)例當(dāng)作方法來調(diào)用:
出來的結(jié)果這樣:
注意,把r實(shí)例當(dāng)作控制臺幢妄,只能夠通過r(r代碼)的方式來使用r實(shí)例兔仰,字典的方式行不通。
加載自定義函數(shù)
在實(shí)際應(yīng)用中蕉鸳,使用R語言來編寫自己的函數(shù)同樣是不可避免的乎赴,在R控制臺中,可以使用source(‘script_path’)的方法來加載自定 義R腳本潮尝。而在Python中使用自己義R腳本中的函數(shù)也同樣方便:使用r.source(‘script_path’)即可把自定義函數(shù)加載到全局環(huán)境 中榕吼,再使用r.自定義方法名就可以實(shí)現(xiàn)調(diào)用,我就是這樣做的勉失,在此不再詳述羹蚣,同學(xué)們自己動手玩一下。
R Vector與Python list
向量(Vector)是R的一個最重要的也是最常用的數(shù)據(jù)類型乱凿,可以理解為一個二維數(shù)據(jù)顽素,對應(yīng)Python的list。在R控制臺中徒蟆,聲明一個變 量:“x <- 1”胁出,X會被聲明成一個向量,而其第一個值是1段审。R常常用c()函數(shù)來聲創(chuàng)建一個由多個值組成的向量全蝶,例如c(1,2,3,4)。Python要與R打交 道,除了訪問R對象和調(diào)用R函數(shù)裸诽,還有就是要學(xué)會如何轉(zhuǎn)換常見的數(shù)據(jù)類型。
rpy2提供了幾個類型凳,供我們把Python的list轉(zhuǎn)換成R的Vector丈冬。分別是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector為例,將Python的list轉(zhuǎn)換成R的Vector:robjects.IntVector([1,2,3,4,5])甘畅,畢埂蕊!
下面來使用剛學(xué)到的類型轉(zhuǎn)換知識畫上一個例子的散點(diǎn)圖來結(jié)束此次體驗(yàn):
沒有結(jié)束
rpy2提供的不僅僅是上面這些,上面的知識只是rpy2所提供的20%疏唾,但是已經(jīng)足以解決80%的問題蓄氧。rpy2還提供了更低級的API,你可以做更多的事情槐脏,例如你可以實(shí)現(xiàn)另一個robjects對象來支持使用”.”來訪問帶名字空間的對象和函數(shù)喉童。更多的知識,請移步官方文檔顿天。