讓R與Python共舞

來源:互聯網
上載者:User

標籤:

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

讓R與Python共舞

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.