天天看點

《資料驅動的網絡分析》——6.2 R語言基礎知識

本節書摘來自異步社群《資料驅動的網絡分析》一書中的第6章,第6.2節,作者: 【美】michael collins 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

本節是r語言的速成教程。r是一種特性豐富的語言,我也隻是略懂一二。但是,在本節結束時,你就能夠編寫簡單的r程式,在指令行上運作,并将其儲存為一個庫。

6.2.1 r提示符

啟動r,将會顯示一個視窗和指令提示符。圖6-1展示了一個r控制台的例子。如圖所示,控制台主要是一個大的文本視窗,頂部的一系列按鈕提供了輔助功能。注意按鈕欄下的兩個文本框,第一個顯示目前工作目錄,第二個是幫助功能。r有很好的文檔,是以一定要習慣使用幫助框。

《資料驅動的網絡分析》——6.2 R語言基礎知識

在圖6-1中,我輸入了幾條簡單的指令:

r的指令行提示符是>,你可以在提示符後面手工輸入指令,如果指令隻完成了一部分(例如,有左括号而沒有右括号),下一個提示符将變成加号,并持續到指令結束。

注意,當r傳回一個值(例如,上例中的s輸出),它将列印“[1]”。方括号中的值是數組索引,如果數組分布到多行,每行的開始将列印相應的索引。

幫助可以使用help(term)或?term通路,可以用help.search()或??在幫助中搜尋。

可以使用開關圖示或者作業系統對應的退出指令(command-q或ctrl-q)退出r。如果你使用純指令行r(不使用圖形界面),可以使用ctrl-d組合鍵或者在指令行上鍵入q()結束會話。

r終止時,會詢問是否儲存工作區。工作區檔案可以在會話之後重新加載,繼續終止時正在完成的任何工作。

6.2.2 r變量

r支援一些不同的資料類型,包括标量整數、字元資料(字元串)、布爾和浮點值、矢量、矩陣和清單。标量類型(如下面的例子中所示)可以用←(“取值”)、=和→運算符指派。r的指派運算符中包含了一些複雜的作用域,對于我們的目的(以及幾乎所有r程式設計),r風格指南建議使用←運算符代替=符号。

r矢量(vector)是有序的一個或者多個同類值:字元、邏輯或者字元串。矢量可以用c函數或者一些其他的函數建立,是r中最常用的元素:我們在前面使用的标量值從技術上說是長度為1的矢量值。1

注意字元矢量的長度:在r中,字元串不管字元數量多少,都被當作單個元素。有一些函數可以通路字元串——nchar獲得字元串長度,substr和strsplit從字元串提取元素——但是單獨的字元串不能像python中那樣直接通路。

r提供了許多矢量算術函數。矢量可以加或者乘以另一個矢量,如果它們的大小相等,結果是逐個元素計算得出的。如果其中一個矢量較小,它将被重複,形成相同大小的矢量。(如果一個矢量的長度不是另一個矢量長度的因數,會出現錯誤)這也适用于單元素矢量:将單一進制素多次加上較長矢量中的元素。

矢量可以索引。單個元素可以用方括号通路,v[k]是v的第k個元素。矢量還支援範圍切片,如v[a:b]。負數索引将把該索引代表的元素從矢量中删除,如下面的代碼塊:

r可以用matrix函數,從矢量中建構矩陣。和矢量一樣,矩陣可以進行加法和乘法運算(和自身、矢量以及其他矩陣),也可以使用不同的方法進行選擇和切片,如:

r清單(list)實際上是一個矢量,其中每個元素都可以由清單組成。和矩陣一樣,清單可以用特殊的指令構造,可以像矢量那樣切片,但是單個元素使用兩個方括号通路。更有趣的是,清單可以命名,單獨的數量可以指定一個名稱,然後用$運算符通路。

了解清單文法對于資料幀很重要,我們将在後面更深入地探讨。

6.2.3 編寫函數

r函數通過把function指令綁定到一個符号來建立,例如:

注意花括号。在r中,花括号用于容納多個表達式,并傳回最後一條語句的結果。花括号可以在沒有函數或者任何其他内容的情況下使用,例如:

是以,在simple_math函數中,括号裡的結果順序求值,傳回最終結果。最終結果不一定和代碼塊中靠前的語句有任何關系。r可以使用return語句控制函數的終止和傳回,但是如果結果很明顯,一般的慣例是不使用它。

正如例中所示,函數參數在函數語句中定義。參數可以使用=号提供預設值。定義預設值的參數都是可選的。參數可以通過順序或者明确使用參數名指派,如:

r的函數型特征使你可以将函數看作可以操縱、求值的對象,在必要時應用。函數可以傳遞給其他函數作為參數,也可以使用apply和reduce函數,支援更複雜的求值。

關于r中的循環,要注意一點:衆所周知,r循環(特别是for循環)的速度緩慢。許多在python或者c中完成的for循環在r中使用許多函數型結構完成,其中最常用的是sapply和reduce。

6.2.4 條件與循環

r的基本條件語句是if…then…else,else if用于表示多條語句。if語句本身是一個函數,傳回一個可以求取的數值:

r提供了switch語句,作為多個if/then子句的緊湊替代品。開關語句對整數比較使用位置型參數,對文本比較則采用可選的參數指派:

r有3種循環結構:repeat預設提供無限循環,while每次循環都進行條件求值,for在一個矢量上循環。循環的内部操作由break(終止循環)和next(跳過一次循環)控制,如:

雖然r提供了這些循環結構,但是最好是避免循環,而用sapply等函數型操作代替。r不是通用的程式設計語言,它的設計目的是為統計分析人員提供豐富的操作工具包。r包含了大量經過優化的函數和用于操縱資料的其他工具。我們将在本章後面介紹一些這方面的功能,但是好的r參考來源是很寶貴的。