- 點擊上方「中國統計網」訂閱我吧!-
R(又稱R語言)是一款開源的跨平臺的數值統計和數值圖形化展現工具。通俗點說,R是用來做統計和畫圖的。R擁有自己的腳本語言和大量的統計、圖形庫(得益於開源社區),這讓她看起來既美又實用。與其他同類軟體(如 SPSS)相比,R的特點是純命令行的,這倒也好,我們更應該把注意力放在數據本身,而非統計工具的UI。
R雖說有一套自己的語言,還挺完備,但它最專業的還是做統計和畫圖,而像連接資料庫、文本處理、文件操作等這些髒活可不能委屈R來做,這些得有其他語言來負責,我的選擇是咱最熟悉的、做這些髒活最棒的Python。那接下來的問題很清楚了,R和Python如何一起工作?我總結了2個方法來進行操作。
Python把源數據處理乾淨,生成格式化的文件放在預定的目錄下,做個定時器讓R去讀文件,最終輸出統計結果和圖表。
這種做法一定程度上可行,除了做定時器外,還可以讓Python即時執行」rscript」命令調用R腳本來工作,只是這種辦法限制太大,只能夠交換文件,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實例是指rpy2.robjects.R,它是在Python中的嵌入式R進程,把R當作從python走向R的通道來看就可以了。通過R實例,我們可以讀取R的內置變量、調用R的函數、甚至,直接把它當作R的解析器來用。
在R的命令行中,我們直接輸入對象名來訪問R的內置對象,如pi、letters:
>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對象:
>>> 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實例,我們可以輕易地實現用Python調用R的函數。下面我們分別在R控制臺和python命令行下讀一個數據文件並畫一張點圖。
R控制臺讀取文件畫點圖:
> data = read. table( 'data.csv')> data total sms gprsA 10 4 6B 9 4 5C 9 4 5D 10 5 5> mtx . data. matrix(data)> dotchart (mtx)代碼解讀:
結果如下:
接下來用python來做一遍同樣的事情,我們之前了解到,使用R實例可以直接訪問R對象,還可以直接調用R的函數,其實在Python看來,對象和函數是相同的東西,函數也是一種對象罷了。現在來試一下調用」read.table()」函數讀入一 個數據文件data.csv:
>>> 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函數,通過」.」的形式調用失敗,必須要用字典的方式或參數的方式來獲得:
>>> data = r['read.table']('data.csv')
>>> data<RDataFrame - Python: 0x4417601 R: 0x2955dc8>>>> print data total sms gprsA 10 4 6B 9 4 5C 9 4 5D 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實例當作方法來調用:
>>> 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自定義方法名就可以實現調用,我就是這樣做的,在此不再詳述,同學們自己動手玩一下。
向量(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])。
下面來使用剛學到的類型轉換知識畫上一個例子的散點圖來結束此次體驗:
>>> 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
來源:簡書