商品簡介
作者簡介
序
那些年,我們一起學過的R語言
公元前
2007年上半年的一天,一堆做基因組序列分析的代碼讓我認識了R語言。那是一份高質量的R代碼,各種標準的向量化操作、匿名函數、優美的代碼格式讓我欣喜,也讓我茫然。同年暑假,有幸到清華大學學習,劉軍老師佈置下來的作業是用HMM模型預測蛋白質二級結構。我壯著膽子,硬著頭皮,以C語言的風格用R語言完成了作業(各種循環,各種醜陋的標量)。
那些年,R語言所有的參考資料就是官方的幾本手冊,但慶倖的是,還有丁國徽博士翻譯的中文版。
公元紀年開始
2008年的初冬,北京市海澱區中國人民大學的一間階梯教室內,舉辦了一場小眾、既不太學術技術檔次也不高的會議。教室外的牆上掛著一條橫幅,上書“第一屆中國R語言會議”。這算是R語言在國內發展歷程中的一個里程碑。100多人參加了為期一天多的會議。參加那次會議的人不少都成為了現在中國R語言社區最活躍的人,比如謝益輝、劉思喆、李艦、張翔、魏太雲、陳堰平等人。當然,其中也有當時就已經算是R語言社區元老的吳喜之老師和丁國徽博士。
沒記錯的話,當時出席會議的還有機械工業出版社的編輯。因為作為會議的承辦機構,統計之都社區(http://cos.name)的骨幹們已經想通過出版一本高質量R語言書來推動R語言在中國的發展,而出版界也已經開始注意到這個小眾市場。那時候,大部分R語言書籍來自學術界。水平高深莫測的專家教授們,乃至R語言的發明人 Robert C. Gentleman 大叔寫出來的書,都讓我這種初窺門徑的人越看越糊塗。同時,中文的R語言書籍也開始出現,但都只是將R語言作為某個特定領域(比如生物信息學)的數據分析工具。
文藝復興
會議舉辦了,人也都混了個臉熟,但R語言在國內的發展依舊不溫不火。直到2011年,大數據突然火了起來,R語言一舉殺進編程語言排行榜前20名。劉思喆同學在“碼農”界主流媒體《程序員》上的文章,讓R語言一下子走到了很多人面前。大家發現,這個經常被描述成統計編程語言的東西並不是僅僅擅長統計,其底層融合C/C++/Fortran等各種語言的優勢、層出不窮的新模型、日趨成熟的開發設施,再加上它跟Hadoop、多核計算、MPI等高性能計算技術的迅速結合,讓人們看到了它在大數據時代的潛力。
O’Reilly、Manning等技術圖書出版商迅速跟進。與以往的學術出版社不同,它們的加入讓R語言書籍更容易被普通讀者接受,也迅速降低了R語言的門檻。
你現在翻開的這本書,就是由業內大名鼎鼎的Quick-R網站(http://www.statmethods.net)的創始人Robert I. Kabacoff撰寫並由Manning出版的。全書分為四部分,由淺入深地介紹了R語言本身,以及如何用R語言實現或簡單或複雜的數據分析和繪圖。而書後8個附錄中關於大數據分析、自定義啟動環境、圖形界面等方面的內容,有一些早已被志願者翻譯成中文在互聯網上廣泛流傳。本書內容質量之高,權威性之強,由此可見一斑,足以幫讀者快速地走過我曾經歷過的迷茫。
結束公元紀年
這本書的翻譯工作開始的時候我還在學校讀書,實驗室裡有兩三個人在使用R語言做數據分析,為發表論文而努力。現在,我坐在公司的工位上,周圍的每個人都或多或少在使用R。整個研發部門一千多人,多半每天都會用到R語言。R語言已經是新員工技術培訓的必修內容。
若干天前,同事們在討論中描繪出一個宏大的願景:用高效的數據分析手段,建立起海量生物實驗數據到所有生物表型的預測模型。如果成功,這將結束公元紀年。這個願景的核心不是新的生物實驗技術,也不是如何採集樣本,而是數據分析。
有點畫大餅的意思了,就此打住。讓我們翻開這本書,或許,公元紀年真的能在我們手中結束。
——陳鋼
2012年9月4日夜于深圳華大基因研究院
目次
第一部分 入門
第1章 R語言介紹
1.1 為何要使用R?
1.2 R的獲取和安裝
1.3 R的使用
1.3.1 新手上路
1.3.2 獲取幫助
1.3.3 工作空間
1.3.4 輸入和輸出
1.4 包
1.4.1 什麼是包
1.4.2 包的安裝
1.4.3 包的載入
1.4.4 包的使用方法
1.5 批處理
1.6 將輸出用為輸入——結果的重用
1.7 處理大數據集
1.8 示例實踐
1.9 小結
第2章 創建數據集
2.1 數據集的概念
2.2 數據結構
2.2.1 向量
2.2.2 矩陣
2.2.3 數組
2.2.4 數據框
2.2.5 因子
2.2.6 列表
2.3 數據的輸入
2.3.1 使用鍵盤輸入數據
2.3.2 從帶分隔符的文本文件導入數據
2.3.3 導入Excel數據
2.3.4 導入XML數據
2.3.5 從網頁抓取數據
2.3.6 導入SPSS數據
2.3.7 導入SAS數據
2.3.8 導入Stata數據
2.3.9 導入netCDF數據
2.3.10 導入HDF5數據
2.3.11 訪問數據庫管理系統
2.3.12 通過Stat/Transfer導入數據
2.4 數據集的標注
2.4.1 變量標簽
2.4.2 值標簽
2.5 處理數據對象的實用函數
2.6 小結
第3章 圖形初階
3.1 使用圖形
3.2 一個簡單的例子
3.3 圖形參數
3.3.1 符號和線條
3.3.2 顏色
3.3.3 文本屬性
3.3.4 圖形尺寸與邊界尺寸
3.4 添加文本、自定義坐標軸和圖例
3.4.1 標題
3.4.2 坐標軸
3.4.3 參考線
3.4.4 圖例
3.4.5 文本標注
3.5 圖形的組合
3.6 小結
第4章 基本數據管理
4.1 一個示例
4.2 創建新變量
4.3 變量的重編碼
4.4 變量的重命名
4.5 缺失值
4.5.1 重編碼某些值為缺失值
4.5.2 在分析中排除缺失值
4.6 日期值
4.6.1 將日期轉換為字符型變量
4.6.2 更進一步
4.7 類型轉換
4.8 數據排序
4.9 數據集的合併
4.9.1 添加列
4.9.2 添加行
4.10 數據集取子集
4.10.1 選入(保留)變量
4.10.2 剔除(丟棄)變量
4.10.3 選入觀測
4.10.4 subset()函數
4.10.5 隨機抽樣
4.11 使用SQL語句操作數據框
4.12 小結
第5章 高級數據管理
5.1 一個數據處理難題
5.2 數值和字符處理函數
5.2.1 數學函數
5.2.2 統計函數
5.2.3 概率函數
5.2.4 字符處理函數
5.2.5 其他實用函數
5.2.6 將函數應用於矩陣和數據框
5.3 數據處理難題的一套解決方案
5.4 控制流
5.4.1 重複和循環
5.4.2 條件執行
5.5 用戶自編函數
5.6 整合與重構
5.6.1 轉置
5.6.2 整合數據
5.6.3 reshape包
5.7 小結
第二部分 基本方法
第6章 基本圖形
6.1 條形圖
6.1.1 簡單的條形圖
6.1.2 堆砌條形圖和分組條形圖
6.1.3 均值條形圖
6.1.4 條形圖的微調
6.1.5 棘狀圖
6.2 餅圖
6.3 直方圖
6.4 核密度圖
6.5 箱線圖
6.5.1 使用並列箱線圖進行跨組比較
6.5.2 小提琴圖
6.6 點圖
6.7 小結
第7章 基本統計分析
7.1 描述性統計分析
7.1.1 方法雲集
7.1.2 分組計算描述性統計量
7.1.3 結果的可視化
7.2 頻數表和列聯表
7.2.1 生成頻數表
7.2.2 獨立性檢驗
7.2.3 相關性的度量
7.2.4 結果的可視化
7.2.5 將表轉換為扁平格式
7.3 相關
7.3.1 相關的類型
7.3.2 相關性的顯著性檢驗
7.3.3 相關關係的可視化
7.4 t檢驗
7.4.1 獨立樣本的t檢驗
7.4.2 非獨立樣本的t檢驗
7.4.3 多於兩組的情況
7.5 組間差異的非參數檢驗
7.5.1 兩組的比較
7.5.2 多於兩組的比較
7.6 組間差異的可視化
7.7 小結
第三部分 中級方法
第8章 回歸
8.1 回歸的多面性
8.1.1 OLS回歸的適用情境
8.1.2 基礎回顧
8.2 OLS回歸
8.2.1 用lm()擬合回歸模型
8.2.2 簡單線性回歸
8.2.3 多項式回歸
8.2.4 多元線性回歸
8.2.5 有交互項的多元線性回歸
8.3 回歸診斷
8.3.1 標準方法
8.3.2 改進的方法
8.3.3 線性模型假設的綜合驗證
8.3.4 多重共線性
8.4 異常觀測值
8.4.1 離群點
8.4.2 高杠杆值點
8.4.3 強影響點
8.5 改進措施
8.5.1 刪除觀測點
8.5.2 變量變換
8.5.3 增刪變量
8.5.4 嘗試其他方法
8.6 選擇“最佳”的回歸模型
8.6.1 模型比較
8.6.2 變量選擇
8.7 深層次分析
8.7.1 交叉驗證
8.7.2 相對重要性
8.8 小結
第9章 方差分析
9.1 術語速成
9.2 ANOVA模型擬合
9.2.1 aov()函數
9.2.2 表達式中各項的順序
9.3 單因素方差分析
9.3.1 多重比較
9.3.2 評估檢驗的假設條件
9.4 單因素協方差分析
9.4.1 評估檢驗的假設條件
9.4.2 結果可視化
9.5 雙因素方差分析
9.6 重複測量方差分析
9.7 多元方差分析
9.7.1 評估假設檢驗
9.7.2 穩健多元方差分析
9.8 用回歸來做ANOVA
9.9 小結
第10章 功效分析
10.1 假設檢驗速覽
10.2 用pwr包做功效分析
10.2.1 t檢驗
10.2.2 方差分析
10.2.3 相關性
10.2.4 線性模型
10.2.5 比例檢驗
10.2.6 卡方檢驗
10.2.7 在新情況中選擇合適的效應值
10.3 繪製功效分析圖形
10.4 其他軟件包
10.5 小結
第11章 中級繪圖
11.1 散點圖
11.1.1 散點圖矩陣
11.1.2 高密度散點圖
11.1.3 三維散點圖
11.1.4 氣泡圖
11.2 折線圖
11.3 相關圖
11.4 馬賽克圖
11.5 小結
第12章 重抽樣與自助法
12.1 置換檢驗
12.2 用coin包做置換檢驗
12.2.1 獨立兩樣本和K樣本檢驗
12.2.2 列聯表中的獨立性
12.2.3 數值變量間的獨立性
12.2.4 兩樣本和K樣本相關性檢驗
12.2.5 深入探究
12.3 lmPerm包的置換檢驗
12.3.1 簡單回歸和多項式回歸
12.3.2 多元回歸
12.3.3 單因素方差分析和協方差分析
12.3.4 雙因素方差分析
12.4 置換檢驗點評
12.5 自助法
12.6 boot包中的自助法
12.6.1 對單個統計量使用自助法
12.6.2 多個統計量的自助法
12.7 小結
第四部分 高級方法
第13章 廣義線性模型
13.1 廣義線性模型和glm()函數
13.1.1 glm()函數
13.1.2 連用的函數
13.1.3 模型擬合和回歸診斷
13.2 Logistic回歸
13.2.1 解釋模型參數
13.2.2 評價預測變量對結果概率的影響
13.2.3 過度離勢
13.2.4 擴展
13.3 泊松回歸
13.3.1 解釋模型參數
13.3.2 過度離勢
13.3.3 擴展
13.4 小結
第14章 主成分和因子分析
14.1 R中的主成分和因子分析
14.2 主成分分析
14.2.1 判斷主成分的個數
14.2.2 提取主成分
14.2.3 主成分旋轉
14.2.4 獲取主成分得分
14.3 探索性因子分析
14.3.1 判斷需提取的公共因子數
14.3.2 提取公共因子
14.3.3 因子旋轉
14.3.4 因子得分
14.3.5 其他與EFA相關的包
14.4 其他潛變量模型
14.5 小結
第15章 處理缺失數據的高級方法
15.1 處理缺失值的步驟
15.2 識別缺失值
15.3 探索缺失值模式
15.3.1 列表顯示缺失值
15.3.2 圖形探究缺失數據
15.3.3 用相關性探索缺失值
15.4 理解缺失數據的來由和影響
15.5 理性處理不完整數據
15.6 完整實例分析(行刪除)
15.7 多重插補
15.8 處理缺失值的其他方法
15.8.1 成對刪除
15.8.2 簡單(非隨機)插補
15.9 小結
第16章 高級圖形進階
16.1 R中的四種圖形系統
16.2 lattice包
16.2.1 條件變量
16.2.2 面板函數
16.2.3 分組變量
16.2.4 圖形參數
16.2.5 頁面擺放
16.3 ggplot2包
16.4 交互式圖形
16.4.1 與圖形交互:鑒別點
16.4.2 playwith
16.4.3 latticist
16.4.4 iplots包的交互圖形
16.4.5 rggobi
16.5 小結
後記:探索R的世界
附錄A 圖形用戶界面
附錄B 自定義啟動環境
附錄C 從R中導出數據
附錄D 製作出版級品質的輸出
附錄E R中的矩陣運算
附錄F 本書中用到的擴展包
附錄G 處理大數據
附錄H 更新R
參考文獻
書摘/試閱
數據分析科學(統計學、計量心理學、計量經濟學、機器學習)的發展一直與數據的爆炸式增長保持同步。遠在個人電腦和互聯網發端之前,學術研究人員就已經開發出了很多新的統計方法,並將其研究成果以論文的形式發表在專業期刊上。這些方法可能需要很多年才能夠被程序員改寫並整合到廣泛用於數據分析的統計軟件中。而如今,新的方法層出不窮。統計研究者經常在人們常訪問的網站上發表新方法和改進的方法,並附上相應的實現代碼。
個人電腦的出現還對我們分析數據的方式產生了另外一種影響。當數據分析需要在大型機上完成的時候,機時非常寶貴難求。分析師們會小心地設定可能用到的所有參數和選項,再讓計算機執行計算。程序運行完畢後,輸出的結果可能長達幾十甚至幾百頁。之後,分析師會仔細篩查整個輸出,去蕪存菁。許多受歡迎的統計軟件正是在這個時期開發出來的。直到現在,統計軟件依然在一定程度上沿襲了這種處理方式。
隨著個人電腦將計算變得廉價且便捷,現代數據分析的方式發生了變化。與過去一次性設置好完整的數據分析過程不同,現在這個過程已經變得高度交互化,每一階段的輸出都可以充當下一階段的輸入。一個典型的數據分析過程的示例見圖1-1。在任何時刻,這個循環都可能在進行著數據變換、缺失值插補、變量增加或刪除,甚至重新執行整個過程。當分析師認為他已經深入地理解了數據,並且可以回答所有能夠回答的相關問題時,這個過程即告結束。
個人電腦的出現(特別是高分辨率顯示器的普及)同樣對理解和呈現分析結果產生了重大影響。一圖勝千言,絕對如此!人類非常擅長通過視覺獲取有用信息。現代數據分析也日益依賴通過呈現圖形來揭示含義和表達結果。
圖1-1 典型的數據分析步驟
總而言之,今天的數據分析人士需要從廣泛的數據源(數據庫管理系統、文本文件、統計軟件以及電子表格)獲取數據、將數據片段融合到一起、對數據做清理和標注、用最新的方法進行分析、以有意義有吸引力的圖形化方式展示結果,最後將結果整合成令人感興趣的報告並向利益相關者和公眾發佈。通過下面的介紹你會看到,R正是一個適合完成以上目標的理想而又功能全面的軟件。
1.1 為何要使用R?
與起源于貝爾實驗室的S語言類似,R也是一種為統計計算和繪圖而生的語言和環境,它是一套開源的數據分析解決方案,由一個龐大且活躍的全球性研究型社區維護。但是,市面上也有許多其他流行的統計和製圖軟件,如Microsoft Excel、SAS、IBM SPSS、Stata以及Minitab。為何偏偏要選擇R?
R有著非常多值得推薦的特性。
多數商業統計軟件價格不菲,投入成千上萬美元都是可能的。而R是免費的!如果你是一位教師或一名學生,好處顯而易見。
R是一個全面的統計研究平臺,提供了各式各樣的數據分析技術。幾乎任何類型的數據分析工作皆可在R中完成。
R擁有頂尖水準的製圖功能。如果希望複雜數據可視化,那麼R擁有最全面且最強大的一系列可用功能。
R是一個可進行交互式數據分析和探索的強大平臺。其核心設計理念就是支持圖1-1中所概述的分析方法。舉例來說,任意一個分析步驟的結果均可被輕鬆保存、操作,並作為進一步分析的輸入。
從多個數據源獲取並將數據轉化為可用的形式,可能是一個富有挑戰性的議題。R可以輕鬆地從各種類型的數據源導入數據,包括文本文件、數據庫管理系統、統計軟件,乃至專門的數據倉庫。它同樣可以將數據輸出並寫入到這些系統中。
R是一個無與倫比的平臺,在其上可使用一種簡單而直接的方式編寫新的統計方法。它易於擴展,並為快速編程實現新方法提供了一套十分自然的語言。
R囊括了在其他軟件中尚不可用的、先進的統計計算例程。事實上,新方法的更新速度是以周來計算的。如果你是一位SAS用戶,想像一下每隔幾天就獲得一個新SAS過程的情景。
如果你不想學習一門新的語言,有各式各樣的GUI(Graphical User Interface,圖形用戶界面)工具通過菜單和對話框提供了與R語言同等的功能。
R可運行於多種平臺之上,包括Windows、UNIX和Mac OS X。這基本上意味著它可以運行於你所能擁有的任何計算機上。(本人曾在偶然間看到過在iPhone上安裝R的教程,讓人佩服,但這也許不是一個好主意。)
圖1-2是展示R製圖功能的一個示例。使用一行代碼做出的這張圖,說明了藍領工作、白領工作和專業工作在收入、受教育程度以及職業聲望方面的關係。從專業角度講,這是一幅使用不同的顏色和符號表示不同分組的散點圖矩陣,帶有兩類擬合曲線(線性回歸和局部加權回歸)、置信橢圓以及兩種對密度的展示(核密度估計和軸須圖)。另外,在每個散點圖中都自動標出了值最大的離群點。如果這些術語對你來說很陌生也不必擔心。我們將在後續各章中陸續談及它們。這裡請暫且相信我,它們真的非常酷。(搞統計的人讀到這裡時估計已經垂涎三尺了。)
圖1-2主要表明了以下幾點。
受教育程度(education)、收入(income)、職業聲望(prestige)呈線性相關。
就總體而言,藍領工作者有著更低的受教育程度、收入和職業聲望;反之,專業工作者有著更高的受教育程度、收入和職業聲望。白領工作者介於兩者之間。
有趣的例外是,鐵路工程師(RR.engineer)的受教育程度較低,但收入較高,而牧師(minister)的職業聲望高,收入卻較低。
受教育程度和職業聲望(較輕微地)呈現雙峰分佈,高值和低值數據多於中間的數據。
第8章將會進一步討論這類圖形。重要的是,R能夠讓你以一種簡單而直接的方式創建優雅、信息豐富、高度定制化的圖形。而使用其他統計語言創建類似的圖形不僅費時費力,而且可能根本無法做到。
可惜的是,R的學習曲線較為陡峭。因為它的功能非常豐富,所以文檔和幫助文件也相當多。另外,由於許多功能都是由獨立貢獻者編寫的可選模塊提供的,這些文檔可能比較零散而且很難找到。事實上,要掌握R的所有功能,可以說是一項挑戰。
圖1-2 藍領(bc)、白領(wc)、專業工作者(prof)的收入、受教育程度和職業聲望之間的關係。資料來源:John Fox編寫的car包(函數scatterplot Matrix)。使用其他統計編程語言很難繪製類似的圖形,但在R中只需一到兩行代碼
本書的目標是讓讀者快速而輕鬆地學會使用R。我們將遍覽R的許多功能,介紹到的內容足以讓你開始著手分析數據,並且在需要你深入瞭解的地方給出參考材料。下面我們從R的安裝開始學習。
1.2 R的獲取和安裝
R可以在CRAN(Comprehensive R Archive Network)http://cran.r-project.org上免費下載。Linux、Mac OS X和Windows都有相應編譯好的二進制版本。根據你所選擇平臺的安裝說明進行安裝即可。稍後我們將討論如何通過安裝稱為包(package)的可選模塊(同樣可從CRAN下載)來增強R的功能。附錄H描述了如何對R進行版本升級。
1.3 R的使用
R是一種區分大小寫的解釋型語言。你可以在命令提示符(>)後每次輸入並執行一條命令,或者一次性執行寫在腳本文件中的一組命令。R中有多種數據類型,包括向量、矩陣、數據框(與數據集類似)以及列表(各種對象的集合)。我們將在第2章中討論這些數據類型。
R中的多數功能是由程序內置函數和用戶自編函數提供的,一次交互式會話期間的所有數據對象都被保存在內存中。一些基本函數是默認直接可用的,而其他高級函數則包含於按需加載的程序包中。
R語句由函數和賦值構成。R使用 <-,而不是傳統的 = 作為賦值符號。例如,以下語句:
創建了一個名為x的向量對象,它包含5個來自標準正態分佈的隨機偏差。
注意 R允許使用=為對象賦值。但是這樣寫的R程序並不多,因為它不是標準語法,某些情況下,用等號賦值會出現問題,R程序員可能會因此取笑你。你還可以反轉賦值方向。例如,rnorm(5) -> x與上面的語句等價。重申一下,使用等號賦值的做法並不常見,在本書中不推薦使用。
注釋由符號 # 開頭。在 # 之後出現的任何文本都會被R解釋器忽略。
1.3.1 新手上路
如果你使用的是Windows,從開始菜單中啟動R。在Mac上,則需要雙擊應用程序文件夾中的R圖標。對於Linux,在終端窗口中的命令提示符下敲入R並回車。這些方式都可以啟動R(R界面參見圖1-3)。
圖1-3 Windows中的R界面
讓我們通過一個簡單的虛構示例來直觀地感受一下這個界面。假設我們正在研究生理發育問題,並收集了10名嬰兒在出生後一年內的月齡和體重數據(見表1-1)。我們感興趣的是體重的分佈及體重和月齡的關係。
表1-1 10名嬰兒的月齡和體重
年齡(月) 體重(kg) 年齡(月) 體重(kg)
01 4.4 09 7.3
03 5.3 03 6.0
05 7.2 09 10.4
02 5.2 12 10.2
11 8.5 03 6.1
*以上為虛構數據。
可以使用函數c()以向量的形式輸入月齡和體重數據,此函數可將其參數組合成一個向量或列表。然後用其他函數獲得體重的均值和標準差,以及月齡和體重的相關度,最後用圖形展示月齡和體重的關係,這樣就可以用可視化的方式檢查其中可能存在的趨勢。如代碼清單1-1所示,函數q()將結束會話並允許你退出R。
代碼清單1-1 一個R會話示例
從代碼清單1-1中可以看到,這10名嬰兒的平均體重是7.06 kg,標準差為2.08 kg,月齡和體重之間存在較強的線性關係(相關度 = 0.91)。這種關係也可以從圖1-4所示的散點圖中看到。不出意料,隨著月齡的增長,嬰兒的體重也趨於增加。
散點圖1-4的信息量充足,但略過“功利”,也不夠美觀。接下來的幾章裡,我們會講到如何自定義圖形以契合需要。
小提示 若想大致瞭解R能夠作出何種圖形,在命令行中運行demo(graphics)即可。生成的
部分圖形如圖1-5所示。其他的演示還有demo(Hershey)、demo(persp)和demo(image)。要看到完整的演示列表,不加參數直接運行demo()即可。
圖1-4 嬰兒體重(千克)和年齡(月)的散點圖
圖1-5 函數demo()繪製的圖形示例
1.3.2 獲取幫助
R提供了大量的幫助功能,學會如何使用這些幫助文檔可以在相當程度上助力你的編程工作。R的內置幫助系統提供了當前已安裝包中所有函數的細節、參考文獻以及使用示例。幫助文檔可以通過表1-2中列出的函數進行查看。
表1-2 R中的幫助函數
函 數 功 能
help.start() 打開幫助文檔首頁
help("foo")或?foo 查看函數foo的幫助(引號可以省略)
help.search("foo")或??foo 以foo為關鍵詞搜索本地幫助文檔
example("foo") 函數foo的使用示例(引號可以省略)
RSiteSearch("foo") 以foo為關鍵詞搜索在線文檔和郵件列表存檔
apropos("foo", mode="function") 列出名稱中含有foo的所有可用函數
data() 列出當前已加載包中所含的所有可用示例數據集
vignette() 列出當前已安裝包中所有可用的vignette文檔
vignette("foo") 為主題foo顯示指定的vignette文檔
函數help.start()會打開一個瀏覽器窗口,我們可在其中查看入門和高級的幫助手冊、常見問題集,以及參考材料。函數RSiteSearch()可在在線幫助手冊和R-Help郵件列表的討論存檔中搜索指定主題,並在瀏覽器中返回結果。由函數vignette()函數返回的vignette文檔一般是PDF格式的實用介紹性文章。不過,並非所有的包都提供了vignette文檔。不難發現,R提供了大量的幫助功能,學會如何使用這些幫助文檔,毫無疑問地會有助於編程。我經常會使用?來查看某些函數的功能(如選項或返回值)。
1.3.3 工作空間
工作空間(workspace)就是當前R的工作環境,它儲存著所有用戶定義的對象(向量、矩陣、函數、數據框、列表)。在一個R會話結束時,你可以將當前工作空間保存到一個鏡像中,並在下次啟動R時自動載入它。各種命令可在R命令行中交互式地輸入。使用上下方向鍵查看已輸入命令的歷史記錄。這樣我們就可以選擇一個之前輸入過的命令並適當修改,最後按回車重新執行它。
當前的工作目錄(working directory)是R用來讀取文件和保存結果的默認目錄。我們可以使用函數getwd()來查看當前的工作目錄,或使用函數setwd()設定當前的工作目錄。如果需要讀入一個不在當前工作目錄下的文件,則需在調用語句中寫明完整的路徑。記得使用引號閉合這些目錄名和文件名。
用於管理工作空間的部分標準命令見表1-3。
表1-3 用於管理R工作空間的函數
函 數 功 能
getwd() 顯示當前的工作目錄
setwd("mydirectory") 修改當前的工作目錄為mydirectory
ls() 列出當前工作空間中的對象
rm(objectlist) 移除(刪除)一個或多個對象
help(options) 顯示可用選項的說明
options() 顯示或設置當前選項
history(#) 顯示最近使用過的#個命令(默認值為25)
savehistory("myfile") 保存命令歷史到文件myfile中(默認值為.Rhistory)
loadhistory("myfile") 載入一個命令歷史文件(默認值為.Rhistory)
save.image("myfile") 保存工作空間到文件myfile中(默認值為.RData)
save(objectlist, file="myfile") 保存指定對象到一個文件中
load("myfile") 讀取一個工作空間到當前會話中(默認值為.RData)
q() 退出R。將會詢問你是否保存工作空間
要瞭解這些命令是如何運作的,運行代碼清單1-2中的代碼並查看結果。
代碼清單1-2 用於管理R工作空間的命令使用示例
首先,當前工作目錄被設置為C:/myprojects/project1,當前的選項設置情況將顯示出來,而數字將被格式化,顯示為具有小數點後三位有效數字的格式。然後,我們創建了一個包含20個均勻分佈隨機變量的向量,生成了此數據的摘要統計量和直方圖。最後,命令的歷史記錄保存到文件.Rhistory中,工作空間(包含向量x)保存到文件.RData中,會話結束。
注意setwd()命令的路徑中使用了正斜杠。R將反斜杠(\)作為一個轉義符。即使在Windows平臺上運行R,在路徑中也要使用正斜杠。同時注意,函數setwd()不會自動創建一個不存在的目錄。如果必要的話,可以使用函數dir.create()來創建新目錄,然後使用setwd()將工作目錄指向這個新目錄。
在獨立的目錄中保存項目是一個好主意。我通常會在啟動一個R會話時使用setwd()命令指定到某一個項目的路徑,後接不加選項的load()命令。這樣做可以讓我從上一次會話結束的地方重新開始,並保證各個項目之間的數據和設置互不干擾。在Windows和Mac OS X平臺上就更簡單了。跳轉到項目所在目錄並雙擊保存的鏡像文件即可。這樣做可以啟動R,載入保存的工作空間,並設置當前工作目錄到這個文件夾中。
1.3.4 輸入和輸出
啟動R後將默認開始一個交互式的會話,從鍵盤接受輸入並從屏幕進行輸出。不過你也可以處理寫在一個腳本文件(一個包含了R語句的文件)中的命令集並直接將結果輸出到多類目標中。
1. 輸入
函數source("filename")可在當前會話中執行一個腳本。如果文件名中不包含路徑,R將假設此腳本在當前工作目錄中。舉例來說,source("myscript.R")將執行包含在文件myscript.R中的R語句集合。依照慣例,腳本文件以.R作為擴展名,不過這並不是必需的。
2. 文本輸出
函數sink("filename")將輸出重定向到文件filename中。默認情況下,如果文件已經存在,則它的內容將被覆蓋。使用參數append=TRUE可以將文本追加到文件後,而不是覆蓋它。參數split=TRUE可將輸出同時發送到屏幕和輸出文件中。不加參數調用命令sink()將僅向屏幕返回輸出結果。
3. 圖形輸出
雖然sink()可以重定向文本輸出,但它對圖形輸出沒有影響。要重定向圖形輸出,使用
表1-4中列出的函數即可。最後使用dev.off()將輸出返回到終端。
表1-4 用於保存圖形輸出的函數
函 數 輸 出
pdf("filename.pdf") PDF文件
win.metafile("filename.wmf") Windows圖元文件
png("filename.png") PBG文件
jpeg("filename.jpg") JPEG文件
bmp("filename.bmp") BMP文件
postscript("filename.ps") PostScript文件
讓我們通過一個示例來瞭解整個流程。假設我們有包含R代碼的三個腳本文件script1.R、script2.R和script3.R。執行語句:
將會在當前會話中執行script1.R中的R代碼,結果將出現在屏幕上。
如果執行語句:
文件script2.R中的R代碼將執行,結果也將顯示在屏幕上。除此之外,文本輸出將被追加到文件myoutput中,圖形輸出將保存到文件mygraphs.pdf中。
最後,如果我們執行語句:
文件script3.R中的R代碼將執行,結果將顯示在屏幕上。這一次,沒有文本或圖形輸出保存到文件中。整個流程大致如圖1-6所示。
圖1-6 使用函數source()進行輸入並使用函數sink()進行輸出
R對輸入來源和輸出走向的處理相當靈活,可控性很強。在1.5節中,我們將學習如何在批處理模式下運行R程序。
1.4 包
R提供了大量開箱即用的功能,但它最激動人心的一部分功能是通過可選模塊的下載和安裝來實現的。目前有2500多個稱為包(package)的用戶貢獻模塊可從http://cran.r-project.org/ web/packages下載。這些包提供了橫跨各種領域、數量驚人的新功能,包括分析地理數據、處理蛋白質質譜,甚至是心理測驗分析的功能。本書中多次使用了這些可選包。
1.4.1 什麼是包
包是R函數、數據、預編譯代碼以一種定義完善的格式組成的集合。計算機上存儲包的目錄稱為庫(library)。函數.libPaths()能夠顯示庫所在的位置,函數library()則可以顯示庫中有哪些包。
R自帶了一系列默認包(包括base、datasets、utils、grDevices、graphics、stats以及methods),它們提供了種類繁多的默認函數和數據集。其他包可通過下載來進行安裝。安裝好以後,它們必須被載入到會話中才能使用。命令search()可以告訴你哪些包已加載並可使用。
1.4.2 包的安裝
有許多R函數可以用來管理包。第一次安裝一個包,使用命令install.packages()即可。舉例來說,不加參數執行install.packages()將顯示一個CRAN鏡像站點的列表,選擇其中一個鏡像站點之後,將看到所有可用包的列表,選擇其中的一個包即可進行下載和安裝。如果知道自己想安裝的包的名稱,可以直接將包名作為參數提供給這個函數。例如,包gclus中提供了創建增強型散點圖的函數。可以使用命令install.packages("gclus")來下載和安裝它。
一個包僅需安裝一次。但和其他軟件類似,包經常被其作者更新。使用命令update.packages()可以更新已經安裝的包。要查看已安裝包的描述,可以使用installed.packages()命令,這將列出安裝的包,以及它們的版本號、依賴關係等信息。
1.4.3 包的載入
包的安裝是指從某個CRAN鏡像站點下載它並將其放入庫中的過程。要在R會話中使用它,還需要使用library()命令載入這個包。例如,要使用gclus包,執行命令library(gclus)即可。當然,在載入一個包之前必須已經安裝了這個包。在一個會話中,包只需載入一次。如果需要,你可以自定義啟動環境以自動載入會頻繁使用的那些包。啟動環境的自定義在附錄B中有詳細描述。
1.4.4 包的使用方法
載入一個包之後,就可以使用一系列新的函數和數據集了。包中往往提供了演示性的小型數據集和示例代碼,能夠讓我們嘗試這些新功能。幫助系統包含了每個函數的一個描述(同時帶有示例),每個數據集的信息也被包括其中。命令help(package="package_name")可以輸出某個包的簡短描述以及包中的函數名稱和數據集名稱的列表。使用函數help()可以查看其中任意函數或數據集的更多細節。這些信息也能以PDF幫助手冊的形式從CRAN下載。
R語言編程中的常見錯誤
有一些錯誤是R的初學者和經驗豐富的R程序員都可能常犯的。如果程序出錯了,請檢查以下幾方面。
? 使用了錯誤的大小寫。help()、Help()和HELP()是三個不同的函數(只有第一個
是正確的)。
? 忘記使用必要的引號。install.packages("gclus")能夠正常執行,然而Ins-
tall.packages(gclus)將會報錯。
? 在函數調用時忘記使用括號。例如,要使用help()而非help。即使函數無需參數,
仍需加上()。
? 在Windows上,路徑名中使用了\。R將反斜杠視為一個轉義字符。setwd("c:\
mydata")會報錯。正確的寫法是setwd("c:/mydata")或setwd("c:\\mydata")。
? 使用了一個尚未載入包中的函數。函數order.clusters()包含在包gclus中。如
果還沒有載入這個包就使用它,將會報錯。
R的報錯信息可能是含義模糊的,但如果謹慎遵守了以上要點,就應該可以避免許多錯誤。
1.5 批處理
多數情況下,我們都會交互式地使用R:在提示符後輸入命令,接著等待該命令的輸出結果。偶爾,我們可能想要以一種重複的、標準化的、無人值守的方式執行某個R程序,例如,你可能需要每個月生成一次相同的報告,這時就可以在R中編寫程序,在批處理模式下執行它。
如何以批處理模式運行R與使用的操作系統有關。在Linux或Mac OS X系統下,可以在終端窗口中使用如下命令:
其中infile是包含了要執行的R代碼所在文件的文件名,outfile是接收輸出文件的文件名,options部分則列出了控制執行細節的選項。依照慣例,infile的擴展名是.R,outfile的擴展名為.Rout。
對於Windows,則需使用:
將路徑調整為R.exe所在的相應位置和腳本文件所在位置。要進一步瞭解如何調用R,包括命令行選項的使用方法,請參考CRAN(http://cran.r-project.org)上的文檔“Introduction to R” 。
1.6 將輸出用為輸入——結果的重用
R的一個非常實用的特點是,分析的輸出結果可輕鬆保存,並作為進一步分析的輸入使用。讓我們通過一個R中已經預先安裝好的數據集作為示例闡明這一點。如果你無法理解這裡涉及的統計知識,也別擔心,我們在這裡關注的只是一般原理。
首先,利用汽車數據mtcars執行一次簡單線性回歸,通過車身重量(wt)預測每加侖行駛的英里數(mpg)。可以通過以下語句實現:
結果將顯示在屏幕上,不會保存任何信息。
下一步,執行回歸,區別是在一個對象中保存結果:
以上賦值語句創建了一個名為lmfit的列表對象,其中包含了分析的大量信息(包括預測值、殘差、回歸係數等)。雖然屏幕上沒有顯示任何輸出,但分析結果可在稍後被顯示和繼續使用。
鍵入summary(lmfit)將顯示分析結果的統計概要,plot(lmfit)將生成回歸診斷圖形,而語句cook<-cooks.distance(lmfit)將計算影響度量統計量,plot(cook)對其繪圖。要在新的車身重量數據上對每加侖行駛的英里數進行預測,不妨使用predict(lmfit, mynewdata)。
要瞭解某個函數的返回值,查閱這個函數在線幫助文檔中的“Value”部分即可。本例中應當查閱help(lm)或?lm中的對應部分。這樣就可以知道將某個函數的結果賦值到一個對象時,保存下來的結果具體是什麼。
1.7 處理大數據集
程序員經常問我R是否可以處理大數據問題。他們往往需要處理來自互聯網、氣候學、遺傳學等研究領域的海量數據。由於R在內存中存儲對象,往往會受限於可用的內存量。舉例來說,在我服役了5年的2G內存Windows PC上,我可以輕鬆地處理含有1000萬個元素的數據集(100個變量×100 000個觀測)。在一台4G內存的iMac上,我通常可以不費力地處理含有上億元素的數據。
但是也要考慮到兩個問題:數據集的大小和要應用的統計方法。R可以處理GB級到TB級的數據分析問題,但需要專門的手段。大數據集的管理和分析問題留待附錄G中討論。
1.8 示例實踐
我們將以一個結合了以上各種命令的示例結束本章。以下是任務描述。
(1) 打開幫助文檔首頁,並查閱其中的“Introduction to R”。
(2) 安裝vcd包(一個用於可視化類別數據的包,我們將在第11章中使用)。
(3) 列出此包中可用的函數和數據集。
(4) 載入這個包並閱讀數據集Arthritis的描述。
(5) 顯示數據集Arthritis的內容(直接輸入一個對象的名稱將列出它的內容)。
(6) 運行數據集Arthritis自帶的示例。如果不理解輸出結果,也不要擔心。它基本上顯示了接受治療的關節炎患者較接受安慰劑的患者在病情上有了更多改善。
(7) 退出。
所需的代碼如代碼清單1-3所示,圖1-7顯示了結果的示例。
代碼清單1-3 使用一個新的包
圖1-7 代碼清單1-3的輸出。(從左至右)為關節炎示例的輸出結果、幫助文檔首頁、vcd包的信息、Arthritis數據集的信息,以及一幅展示關節炎治療情況和治療結果之間關係的圖
如本例所示,我們只需使用少量R代碼即可完成大量工作。
1.9 小結
本章中,我們瞭解了R的一些優點,正是這些優點吸引了學生、研究者、統計學家以及數據分析師等希望理解數據所具有意義的人。我們從程序的安裝出發,討論了如何通過下載附加包來增強R的功能。探索了R的基本界面,以交互和批處理兩種方式運行了R程序,並繪製了一些示例圖形。還學習了如何將工作保存到文本和圖形文件中。由於R的複雜性,我們花了一些時間來瞭解如何訪問大量現成可用的幫助文檔。希望你對這個免費軟件的強大之處有了一個總體的感覺。
既然已經能夠正常運行R,那麼是時候把玩你自己的數據了。在下一章中,我們將著眼於R能夠處理的各種數據類型,以及如何從文本文件、其他程序和數據庫管理系統中導入數據。
主題書展
更多書展購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

