r與python互動 讓R與Python共舞

2021-10-12 11:02:08 字數 2632 閱讀 9146

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例項,我們可以輕易地實現用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

rpy2提供了幾個類,供我們把python的list轉換成r的vector。分別是 robjects.intvector,robjects.boolvector,robjects.strin**ector,robjects.floatvector. 以intvector為例,將python的list轉換成r的vector:robjects.intvector([1,2,3,4,5]),畢!

還在繼續…..rpy2提供的不僅僅是上面這些,上面的知識只是rpy2所提供的20%,但是已經足以解決80%的問題。rpy2還提供了更低階的api,你可以做更多的事情,例如你可以實現另乙個robjects物件來支援使用」.」來訪問帶名字空間的物件和函式。更多的知識,請移步官方文件。

Python中「 r」與「 n」區別

print asdfg nss end print asdfg r nss end print asdfg rss end 直接輸出,第一行和第三行的結果是一樣的。asdfg ss p.s.第二行的結果是在中間空了一行 但是,切換到終端後再執行第一行和第三行的結果有了明顯不同 print asdfg...

R 條件與迴圈

迴圈語句 使用形式 if 條件 如果條件成立,大括號內的語句就被執行 使用形式 if 條件 else 注意 else必須緊跟在 後面,不能另起一行,否則報錯 還可以組合起來用 if.else if.else.語句 if 條件1 else if 條件2 else if 條件3 else switch語...

R 條件與迴圈

迴圈語句 使用形式 if 條件 如果條件成立,大括號內的語句就被執行 使用形式 if 條件 else 注意 else必須緊跟在 後面,不能另起一行,否則報錯 還可以組合起來用 if.else if.else.語句 if 條件1 else if 條件2 else if 條件3 else switch語...