讓R與Python共舞


轉載: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對象來支持使用”.”來訪問帶名字空間的對象和函數。更多的知識,請移步官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM