讓R與Python共舞

R(又稱R語言)是一款開源的跨平臺的數(shù)值統(tǒng)計(jì)和數(shù)值圖形化展現(xiàn) 工具糊治。通俗點(diǎn)說,R是用來做統(tǒng)計(jì)和畫圖的罚舱。R擁有自己的腳本語言和大量的統(tǒng)計(jì)井辜、圖形庫(得益于開源社區(qū)),這讓她看起來既美又實(shí)用管闷。與其他同類軟件(如 SPSS)相比粥脚,R的特點(diǎn)是純命令行的,這倒也好包个,我們更應(yīng)該把注意力放在數(shù)據(jù)本身刷允,而非統(tǒng)計(jì)工具的UI。

R雖說有一套自己的語言碧囊,還挺完備树灶,但她最專業(yè)的還是做統(tǒng)計(jì)和畫圖,而像連接數(shù)據(jù)庫糯而、文本處理天通、文件操作等這些臟活可不能委屈R來干哪,這些得有其 他語言來負(fù)責(zé)熄驼,我的選擇是咱最熟悉的像寒、做這些臟活最棒的Python烘豹。那接下來的問題很清楚了,R和Python如何一起工作诺祸?拍拍腦袋吴叶,想到可能有下面 幾種辦法:

1. R和Python只共享文件,Python把源數(shù)據(jù)處理干凈序臂,生成格式化的文件放在預(yù)定的目錄下蚌卤,做個定時器讓R去讀文件,最終輸出統(tǒng)計(jì)結(jié)果和圖表奥秆。

?這種做法一定程度上可行逊彭,除了做定時器外,還可以讓Python即時執(zhí)行”rscript”命令調(diào)用R腳本來工作构订,只是這種辦法限制太大侮叮,只能夠交換文件,Python不能對R進(jìn)行精確的控制悼瘾。

2. 讓Python直接調(diào)用R的函數(shù)囊榜,R是開源項(xiàng)目,肯定會有一些第三方庫實(shí)現(xiàn)Python與R互通亥宿。

?果然卸勺,我找到了rpy2,可以實(shí)現(xiàn)使用python讀取R的對象烫扼、調(diào)用R的方法以及Python與R數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換等曙求。實(shí)際上除了Python,其他語言與R互通的第三方包也大大的有映企。

最后我選擇第2種方法悟狱,來讓R與Python共舞。

模塊 rpy2.robjects 是rpy2對R的一個高級封裝堰氓,該模塊里包含了一個r對象和一系列的R數(shù)據(jù)結(jié)構(gòu)挤渐。使用rpy2的大多數(shù)情況,只需要跟這個模塊打交道即可双絮。rpy2的安裝 在此不多講了浴麻,有興趣的同學(xué)看文檔去,直接體驗(yàn)一下R如何與Python無縫整合吧掷邦。

了解r實(shí)例

r實(shí)例是指rpy2.robjects.r白胀,它是在Python中的嵌入式R進(jìn)程椭赋,把r當(dāng)作從python走向R的通道來看就可以了抚岗。通過r實(shí)例,我們可以讀取R的內(nèi)置變量哪怔、調(diào)用R的函數(shù)宣蔚、甚至向抢,直接把它當(dāng)作R的解析器來用。

訪問R的對象

在R的命令行中胚委,我們直接輸入對象名來訪問R的內(nèi)置對象挟鸠,如pi、letters:

在R控制臺中訪問R對象

而使用r實(shí)例亩冬,python訪問R對象也很簡單艘希,而且方法很多:

在python中訪問R對象

在這段代碼中,我們用了三種方式來訪問R對象硅急,把r實(shí)例當(dāng)作字典覆享,把r實(shí)例當(dāng)作方法,把r實(shí)例當(dāng) 作一個類對象(真是神喻呀~)营袜。在實(shí)際中撒顿,使用哪一種方式要因習(xí)慣而異,我喜歡的方法是使用第三種荚板,把r實(shí)例當(dāng)作自己人凤壁,直接使用”.”來訪問R對象。但 這種方法有一個缺陷跪另,就是不能訪問帶名字空間的R對象或函數(shù)拧抖,而其他兩種方式是可以的,這點(diǎn)將在隨后說明免绿。

調(diào)用R函數(shù)

通過r實(shí)例徙鱼,我們可以輕易地實(shí)現(xiàn)用Python調(diào)用R的函數(shù)。下面我們分別在R控制臺和python命令行下讀一個數(shù)據(jù)文件并畫一張點(diǎn)圖针姿。

R控制臺讀取文件畫點(diǎn)圖

代碼解讀:

data.csv 的內(nèi)容就是上面代碼的3到7的內(nèi)容袱吆。

data = read.table(‘data.csv’) :把文件讀進(jìn)一個數(shù)據(jù)框變量data中。

mtx = data.matrix(data):把data轉(zhuǎn)變成矩陣距淫。

dotchart(mtx)用矩陣的數(shù)據(jù)畫點(diǎn)圖绞绒。

結(jié)果如下:

接下來用python來做一遍同樣的事情,我們之前了解到榕暇,使用r實(shí)例可以直接訪問R對象蓬衡,還可 以直接調(diào)用R的函數(shù),其實(shí)在Python看來彤枢,對象和函數(shù)是相同的東西狰晚,函數(shù)也是一種對象罷了。現(xiàn)在來試一下調(diào)用”read.table()”函數(shù)讀入一 個數(shù)據(jù)文件data.csv:

出錯了缴啡!怎么回事壁晒?在上面我提到過了,使用“.”引用的方式不能訪問帶有名字空間的R對象和函數(shù)业栅,read.table 是表示在read包下面的table函數(shù)秒咐,通過”.”的形式調(diào)用失敗谬晕,必須要用字典的方式或參數(shù)的方式來獲得:

這段代碼得到的結(jié)果與在R控制臺下畫點(diǎn)圖的效果是一樣的。最后一行 r.dotchart(mtx)是直接通過”.”來調(diào)用R的函數(shù)dotchart的携取,在沒有名實(shí)空間的情況下攒钳,是正常的。如果你為了避免太多不可控制的出 錯機(jī)會雷滋,你可以統(tǒng)一地使用字典的方式來訪問R對象和方法不撑,這是最保險的方法,雖然我個人認(rèn)為看起來有點(diǎn)別扭晤斩。

r實(shí)例就是一R控制臺

其實(shí)r實(shí)例就是一個可交互的R控制臺燎孟,只不過交互對象是Python與R罷了,為了證明r實(shí)例具有R控制臺的特性尸昧,來做個實(shí)驗(yàn)揩页,寫一串R腳本,作為Python一個字符串變量的內(nèi)容烹俗,把該字符串傳給r實(shí)例爆侣,然后把r實(shí)例當(dāng)作方法來調(diào)用:

出來的結(jié)果這樣:

注意,把r實(shí)例當(dāng)作控制臺幢妄,只能夠通過r(r代碼)的方式來使用r實(shí)例兔仰,字典的方式行不通。

加載自定義函數(shù)

在實(shí)際應(yīng)用中蕉鸳,使用R語言來編寫自己的函數(shù)同樣是不可避免的乎赴,在R控制臺中,可以使用source(‘script_path’)的方法來加載自定 義R腳本潮尝。而在Python中使用自己義R腳本中的函數(shù)也同樣方便:使用r.source(‘script_path’)即可把自定義函數(shù)加載到全局環(huán)境 中榕吼,再使用r.自定義方法名就可以實(shí)現(xiàn)調(diào)用,我就是這樣做的勉失,在此不再詳述羹蚣,同學(xué)們自己動手玩一下。

R Vector與Python list

向量(Vector)是R的一個最重要的也是最常用的數(shù)據(jù)類型乱凿,可以理解為一個二維數(shù)據(jù)顽素,對應(yīng)Python的list。在R控制臺中徒蟆,聲明一個變 量:“x <- 1”胁出,X會被聲明成一個向量,而其第一個值是1段审。R常常用c()函數(shù)來聲創(chuàng)建一個由多個值組成的向量全蝶,例如c(1,2,3,4)。Python要與R打交 道,除了訪問R對象和調(diào)用R函數(shù)裸诽,還有就是要學(xué)會如何轉(zhuǎn)換常見的數(shù)據(jù)類型。

rpy2提供了幾個類型凳,供我們把Python的list轉(zhuǎn)換成R的Vector丈冬。分別是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector為例,將Python的list轉(zhuǎn)換成R的Vector:robjects.IntVector([1,2,3,4,5])甘畅,畢埂蕊!

下面來使用剛學(xué)到的類型轉(zhuǎn)換知識畫上一個例子的散點(diǎn)圖來結(jié)束此次體驗(yàn):

沒有結(jié)束

rpy2提供的不僅僅是上面這些,上面的知識只是rpy2所提供的20%疏唾,但是已經(jīng)足以解決80%的問題蓄氧。rpy2還提供了更低級的API,你可以做更多的事情槐脏,例如你可以實(shí)現(xiàn)另一個robjects對象來支持使用”.”來訪問帶名字空間的對象和函數(shù)喉童。更多的知識,請移步官方文檔顿天。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堂氯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牌废,更是在濱河造成了極大的恐慌咽白,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟缕,死亡現(xiàn)場離奇詭異晶框,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門授段,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人番甩,你說我怎么就攤上這事畴蒲。” “怎么了对室?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵模燥,是天一觀的道長。 經(jīng)常有香客問我掩宜,道長蔫骂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任牺汤,我火速辦了婚禮辽旋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己补胚,他們只是感情好码耐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溶其,像睡著了一般骚腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓶逃,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天束铭,我揣著相機(jī)與錄音,去河邊找鬼厢绝。 笑死契沫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昔汉。 我是一名探鬼主播懈万,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靶病!你這毒婦竟也來了钞速?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫡秕,失蹤者是張志新(化名)和其女友劉穎渴语,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昆咽,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驾凶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掷酗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片调违。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泻轰,靈堂內(nèi)的尸體忽然破棺而出技肩,到底是詐尸還是另有隱情,我是刑警寧澤浮声,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布虚婿,位于F島的核電站,受9級特大地震影響泳挥,放射性物質(zhì)發(fā)生泄漏然痊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一屉符、第九天 我趴在偏房一處隱蔽的房頂上張望剧浸。 院中可真熱鬧锹引,春花似錦、人聲如沸唆香。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躬它。三九已至腾啥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虑凛,已是汗流浹背碑宴。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工软啼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桑谍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓祸挪,卻偏偏與公主長得像锣披,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贿条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容