如何讓R與Python一起工作 | 案例講解

2021-12-09 愛數據LoveData

- 點擊上方「中國統計網」訂閱我吧!-

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

來源:簡書

相關焦點

  • 教你在同一個項目中,讓R和Python無縫工作的5種方法
    你要的算法+案例分析+代碼統統有!點擊上圖,查看教學大綱最近,我同時使用R和Python進行了更多的項目。對我而言,使用最佳工具來完成工作變得越來越重要,而不受單一語言的束縛。Python在某些方面做得最好,R在某些方面做得最好,因此,如果我們在需要的時候可以同時使用這兩種方法,那麼我們就可以發揮出最好的性能。
  • 如何在 Rstudio 中使用 python 語言 (圖文詳解)
    直接運行一段測試代碼,如果是從來沒有進行過操作的,Rstudio 會默認下載 Miniconda進行環境搭建及包管理。install.packages("reticulate")install.packages("Rcpp")在R中運行python包都要通過這個進行下載安裝,可以理解為一個R-Python接口測試安裝環境#加載reticulate包library(reticulate)#檢查您的系統是否安裝過
  • rPython:在R語言中調用python命令
    通過發揮rPython的作用,可以很好的將Python與R語言結合在一起,兩者相輔相成,使數據分析工作更加得心應手。目錄      rPython簡介      rPython安裝介紹      rPython使用介紹rPython簡介rPython包用於在R語言環境中調用Python命令。
  • 未來,不是【Python vs R】,而是【Python and R】
    註:以上代碼來自文獻[3],源代可以下載,URL為https://blog.usejournal.com/python-vs-and-r-for-data-scienceon Twitter.https://twitter.com/wesmckinn/status/69 530432 [2]URSA LABS.R and Python are joining forces, in the most ambitious crossover event of the year—for programmers.https://qz.com/1270139/r-and-python-are-joining-forces-in-the-most-ambitious-crossover-event-of-the-year-for-programmers
  • Python數據分析經典案例
    本課程選擇經典案例基於真實數據集,從數據預處理開始到建立機器學習模型以及效果評估,完整的講解如何使用python及其常用庫進行數據的分析和模型的建立
  • R和Python可以兼得嗎?
    用於翻譯 Python 代碼以使其在 R 中工作的 reticulate 包。從現在開始我會使用一個簡單的例子來做說明。假設我在 RStudio 中有一個 R 項目,它需要使用我用 Python 編寫的函數。
  • Python 如何讀取文件?fileinput 是個不錯的選擇
    今天我把 fileinput 的所有的用法、功能進行詳細的講解,並列舉了一些非常實用的案例,對於理解和使用它可以說完全沒有問題。1.$ python demo.py hellohellopythonpython2.
  • 用R也可以跑Python了
    os <- import(「os」)os$getcwd()上面的命令返回工作目錄。[1]"C:\\Users\\DELL\\Documents"您可以使用os包中的listdir()函數來查看工作目錄中的所有文件。
  • Python實戰案例教學(視頻講解) - 開發五子棋遊戲(一)
    收錄於話題 #有趣的python
  • 用R也可以跑Python了
    os <- import(「os」)os$getcwd()上面的命令返回工作目錄。[1]"C:\\Users\\DELL\\Documents"您可以使用os包中的listdir()函數來查看工作目錄中的所有文件。
  • 使用Python和R繪製數據地圖的十七個經典案例
    這篇文章中,你將學習如何用Python和R,使用包括實際代碼示例的幾種方法來布局和可視化地理空間數據。我還列出了資源,以便你可以了解每個教程中突出顯示的每個包以及進一步的用戶分析,從而獲得更多的靈感。 前言 為了探索目的而創建一個簡單的地圖不再需要你學習如何操作shapefile或想像投影。並且,無論你喜歡在R或Python,都有快速和簡單的方法把你的數據展現在地圖上。
  • 一起學Python-外部文件的讀取方法
    今天我們來一起學習Python如何對文件進行操作,Python中對文件的操作非常簡單,不像其他語言那麼麻煩,下面我們通過實例來學習下。認識open代碼既然要操作文件,所以我們需要用open代碼去打開一個文件,比如我們想要讀取一個txt文檔可以寫入一下代碼:f = open("u_info",mode="r",encoding="UTF-8")
  • 從PPT到Word,用Python輕鬆實現辦公自動化
    來源  | 早起Python(ID:zaoqi-python)在之前的自動化系列文章中,我們分別講過如何使用 Python 將 Word 中表格信息批量提取至
  • 如何利用Python實現工作中的自動化
    如何利用Python實現工作中的自動化 「偷懶還能幹完活,才是本事」帥張發了一篇《工作要學會偷懶》,深感贊同。有些事情既然定期都要處理,就沒有更好的處理方式?工作要學會偷懶,尤其對於一些大量重複的工作,第一感覺就要想到如何偷懶。怎麼偷懶呢?做一點簡單的編程工作就可以了。我總結了一些在工作中非常常見的例子,將源碼整理好供參考。
  • Python處理CSV文件
    'r') as fp1, open(file2, 'w') as fp2: for line in fp1: fp2.write(line)csvcsv文件是一類出現頻率非常高的文本文件,在python中有許多方法可以讀寫他。
  • [原]深入對比數據科學工具箱:Python和R 非結構化數據的結構化
    概述在現實場景中,由於數據來源的異構,數據源的格式往往是難以統一的,這就導致大量具有價值的數據通常是以非結構化的形式聚合在一起的}\')".format(id=getMongoData(i,"_id"),value=getMongoData(i,"value"),datetime=getMongoData(i,"datetime"),stock_code=getMongoData(i,"stock_code"),share=getMongoData(i,"share"))sql = r"INSERT INTO `FinanceR
  • Python基礎教程:正則表達式re高級用法與案例
    search需求:匹配出文章閱讀的次數import reret
  • 5個案例對比:Python Pandas 和R data.table
    你要的算法+案例分析+代碼統統有!點擊上圖,查看教學大綱Python和R是數據科學生態系統中的兩種主要語言。它們都提供了豐富的功能選擇並且能夠加速和改進數據科學工作流程。我們不會說那個一個更好,我們這裡的重點是演示這兩個庫如何為數據處理提供高效和靈活的方法。我們將介紹的示例是常見的數據分析和操作操作。因此,您可能會經常使用它們。我們將使用Kaggle上提供的墨爾本住房數據集作為示例。
  • 【一起玩蛇】Python代碼審計中的那些器I
    曾今向前輩請教過,如何學習代碼審計;曾今向大牛問起過,如何學好代碼審計……得到的答案總是出乎的一致:多讀,多審,多寫
  • Python爬蟲與文本分析應用案例研討會
    本課程的授課方式是通過python和knime編程的方式,課程最終目的是實現各種分析的自動化流程,課程成果可以在今後工作中復用。   為什麼要學爬蟲技術,學了以後有什麼好處?每次課程我們都會反覆研究,花大量時間準備課程材料,力求用最適合的案例和方式為學員講解。   ·案例教學的方法:我們從2013年開始舉辦公開的技術培訓,也曾多次給企業做內部培訓,從多年的教學實踐中,我們發現,用傳統以知識點講解為主線,案例為輔的方式,效果並不好。學員反映,聽了後面忘前面,學了一堆東西卻不知道怎麼用。