前言 - 碁峰資訊epaper.gotop.com.tw/pdfsample/a385.pdf · 容。請參考錦囊1.10...

17
前言 R 是一種結合統計、繪圖功能與統計程式設計的強大工具;成千上萬的人們用它來處理 日常所需的重要統計分析工作。R 也是一套免費的開放原始碼軟體系統,集結許多聰 明、勤奮工作者的集體智慧成果。目前 R 已有超過 2,000 個可用的套件,而且逐漸成為 所有商業統計軟體的強勁競爭對手。 然而,剛開始接觸 R 可能會讓人感到無所適從。因為,即使是簡單任務,R 並未直觀的 呈現如何完成任務。一旦您跨越學習門檻,知道如何使用 R,就能很輕易地完成簡單任 務。不過,學習「如何」使用 R 的過程,有時甚至會讓人惱火的失去耐性。 本書內容充滿指引讀者如何使用(how-toR 的實務錦囊,每個錦囊對應解決一個特定 的問題點。錦囊涵蓋解決方案的簡介,針對解決方案細節加以說明,以及關於它如何運 作的解析。我知道這些錦囊是實用的,而且實務上可行,因為我自己也經常使用它們。 實務錦囊涉及的範圍很廣。從基本任務開始,然後介紹資料的輸入和輸出、一般統計、 繪圖功能,與線性迴歸分析等。您可以使用 R 執行的任何重要工作,將是本書涵蓋主題 之範疇。 如果您是 R 的初學者,本書將讓您起步更快。如果您對 R 已具備中等理解程度,本書 對於您擴展 R 的學習視野與鞏固記憶(如:「我該如何執行 Kolmogorov–Smirnov 定?」)將有實質的幫助。 雖然透過錦囊您會學到實務上 R 的操作技巧,但這本書並不是 R 的指導手冊。本書也不 R 的參考手冊,但是書中確實包含許多有用資訊。本書更不是介紹使用 R 進行程式設 計的書,儘管許多錦囊在實務上都能應用至 R 腳本撰寫。 最後,本書不是統計學的入門書。本書假設讀者已熟悉基礎的統計程序,而且只想知道 如何使用 R 實現這些統計運算功能。

Upload: others

Post on 12-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

前言

R是一種結合統計、繪圖功能與統計程式設計的強大工具;成千上萬的人們用它來處理日常所需的重要統計分析工作。R也是一套免費的開放原始碼軟體系統,集結許多聰明、勤奮工作者的集體智慧成果。目前 R已有超過 2,000個可用的套件,而且逐漸成為所有商業統計軟體的強勁競爭對手。

然而,剛開始接觸 R可能會讓人感到無所適從。因為,即使是簡單任務,R並未直觀的呈現如何完成任務。一旦您跨越學習門檻,知道如何使用 R,就能很輕易地完成簡單任務。不過,學習「如何」使用 R的過程,有時甚至會讓人惱火的失去耐性。

本書內容充滿指引讀者如何使用(how-to)R的實務錦囊,每個錦囊對應解決一個特定的問題點。錦囊涵蓋解決方案的簡介,針對解決方案細節加以說明,以及關於它如何運

作的解析。我知道這些錦囊是實用的,而且實務上可行,因為我自己也經常使用它們。

實務錦囊涉及的範圍很廣。從基本任務開始,然後介紹資料的輸入和輸出、一般統計、

繪圖功能,與線性迴歸分析等。您可以使用 R執行的任何重要工作,將是本書涵蓋主題之範疇。

如果您是 R的初學者,本書將讓您起步更快。如果您對 R已具備中等理解程度,本書對於您擴展 R 的學習視野與鞏固記憶(如:「我該如何執行 Kolmogorov–Smirnov 檢定?」)將有實質的幫助。

雖然透過錦囊您會學到實務上 R的操作技巧,但這本書並不是 R的指導手冊。本書也不是 R的參考手冊,但是書中確實包含許多有用資訊。本書更不是介紹使用 R進行程式設計的書,儘管許多錦囊在實務上都能應用至 R腳本撰寫。

最後,本書不是統計學的入門書。本書假設讀者已熟悉基礎的統計程序,而且只想知道

如何使用 R實現這些統計運算功能。

iv | 前言

實務錦囊本書介紹的錦囊,大部分僅使用一或兩個 R軟體函數來解決一個特定問題。需提醒各位的是,我不會詳細描述函數的所有功能;相反地,我只描述必要的細節,而將重心放在

協助您立刻解決問題。幾乎每個書中提到的函數,除本書描述的層面外,都有額外、驚

人的能力,處理更多、更複雜的問題。我強烈建議各位深入閱讀每個函數提供的輔助網

頁資訊,您將能從那些資訊中學到更多有價值的內容。

每個錦囊的設計,原則上是為讀者呈現解決一個特定問題的快速方法。當然,每個問題

皆可能存在好幾種合理的解決方法。當一個問題同時有數個解決方法時,我通常選擇最

簡單的方法介紹給讀者。當然,對於任何賦予的任務,您極可能會自行發現其他書中未

介紹的替代解決方案。此時,請記得,這只是一本實務錦囊,而非經典大全。

尤其 R軟體已有數以千計的附加套件(add-on packages)可供下載,您或許會發現,許多套件執行類似、可相互替代的演算法與統計方法。本書專注於 R軟體基本版本 (basic distribution)內建的核心功能,因此,您最好的替代方案來源或許是尋找或探索其他附加套件(錦囊 1.11)。

專業術語說明每個錦囊的目標在於快速解決問題。為避免冗長乏味的論述,我偶爾簡化專門術語的

描述,也許不夠精確,但是使用正確。舉「泛型函數」(generic function)為例,我將print(x)與 plot(x)稱為泛型函數的使用,是因為它們通用於各種類型的 x,能適當地

處理輸出與繪圖等功能。電腦科學家可能對我的術語表達頗有微辭,因為嚴格說來,這

些不只是「函數」,也是多型方法與動態調度方法。倘若我小心翼翼地解釋每個這類技

術上的細節,重要的解決方案將被淹沒於技術細節中。所以,我選擇泛稱它們為函數,

因為這更能確保易讀性。

另一個例子取自統計學,是關於統計假設檢定於語義上的複雜性。若堅持使用嚴格機率

理論術語,將會模糊某些檢定於實務應用的焦點;因此,當描述每個統計檢定時,我選

擇運用更為通俗的語言。關於更多假設檢定的錦囊呈現方式,請查看第 9章的「簡介」內容。

我的主要目標在於,以淺顯易讀、跳脫學術正式的編寫方式,使廣泛大眾能欣賞體驗 R軟體的強大力量。如果書中的專門術語偶爾表達的不夠嚴謹,我希望各領域的專家們能

理解我的初衷。

前言 | v

軟體和平台說明R軟體基本版本經常更新,然而,其語言定義和核心執行是相當穩定的。本書所介紹的錦囊適用於 R軟體基本版的任何最新版本。

有些錦囊的使用具有特殊的系統平台差異,我已仔細於文中註明。這類型的錦囊多數為

軟體設置的議題,例如:安裝和設定。據我所知,書中所有錦囊皆適用於 R軟體的三大主要平台: Windows、OS X和 Linux/Unix系統。

其他資源

網路

所有關於 R軟體的各方面相關資源,均匯集於 R軟體專案網站(http://www.r-project.

org)。從那裡您可以下載 R軟體程式碼、附加套件、文件與許多其他資源。

除了 R 軟體專案網站,我推薦各位使用專屬於 R 軟體的搜尋引擎,如:Sasha Goodman創設的 Rseek(http://rseek.org)網站。您當然可以使用一般的搜尋引擎,

如:Google,但是搜尋 "R"這個關鍵字時,搜尋結果常同時出現許多不相關的內容。請參考錦囊 1.10瞭解更多關於搜尋網路的細節。

閱讀部落格也是學習 R 與掌握 R 最新發展動態的好方法。目前有許多這類型主題的部落格,我推薦其中兩個部落格:Tal Galili 經營的 R-bloggers(http://www.

r-bloggers.com/)與 PlanetR(http://planetr.stderr.org/)。藉由訂閱 R部落格彙總內容的 RSS,您將能隨時獲取來自許多相關網站中有趣又實用的文章通知。

R軟體書籍

市面上有許多關於學習與使用 R軟體的書籍;列在此處的僅是一些我讀過且覺得實用的書籍。請讀者留意 R軟體專案網站收集大量關於 R軟體的書目資料(http://

www.r-project.org/doc/bib/R-books.html)。

我推薦的書籍包括:William Venables 等人所著的《An Introduction to R》(由

Network Theory Limited出版),它涵蓋許多對初學者而言實用的主題。您可以從CRAN 網站免費下載該書的 PDF 版本(http://cran.r-project.org/doc/manuals/R-intro.

pdf),或者更好的選擇是購買作者的紙本書籍,因為作者將此書所得收益捐給 R軟體專案。第二本書是 Joseph Adler所著(O’Reilly出版)的《R in a Nutshell》(http://

oreilly.com/catalog/9780596801717),它是一本您會想要放在案頭隨時參閱的指南與

參考書,主題涵蓋範圍超過本書內容。

vi | 前言

任何想要運用 R繪製專業圖形的讀者會想參考 Paul Murrell所著的《R Graphics》

(Chapman & Hall/CRC出版)。取決於個人使用繪圖套件的專業需求,您可能也會喜歡 Deepayan Sarkar的《Lattice: Multivariate Data Visualization with R》(Springer出版),以及 Hadley Wickham的《ggplot2: Elegant Graphics for Data Analysis》(Springer出版)。

William Venables 與 Brian Ripley 合著的《Modern Applied Statistics with S》(第四

版,由 Springer出版),使用 R說明許多進階的統計技巧。此書所介紹的函數與資料集可透過下載 MASS套件取得,目前此套件已內建於 R軟體標準發布版(standard distribution)。

雖然書市常有關於 R的程式設計新書出版,我並未廣泛涉獵那方面主題的書籍。關於程式設計,我推薦兩本書一起閱讀,分別是《R in a Nutshell》,以及 William Venables與 Brian Ripley合著的《S Programming》。此外,我也建議讀者下載閱讀

《R Language Definition》(http://cran.r-project.org/doc/manuals/R-lang.pdf),此定義文

件仍持續更新中,但是它能回答許多使用 R作為一種程式開發語言的細節問題。

統計學書籍

您將會需要一本好的統計學教科書或參考書,才能準確解讀 R軟體執行的統計檢定結果。目前市場上有太多這方面的好書,我無法在此逐一推薦。

在學習統計的過程中,一個不錯的選擇是由 John Verzani 所著的《Using R for

Introductory Statistics》(由 Chapman & Hall/CRC出版)。此書結合統計學與 R的教學,提供您應用統計方法的必要運算技能。

愈來愈多的統計學書籍作者選用 R軟體來闡述他們介紹的方法。如果您服務於某個專業領域,您可以透過 R軟體專案書目(bibliography)網頁中找到實用且值得參考的相關書籍(http://www.r-project.org/doc/bib/R-books.html)。

本書編排慣例

本書使用的字型、字體慣例,如下所示:

斜體字(Italic)

用來表示檔名、副檔名、路徑、網址和電子郵件。對於初次提到或重要的詞彙,中

文以楷體字呈現,其對應的英文則以斜體表示。

第二章

基本概念

簡介

本章錦囊主題介於解決問題的想法與教學指南之間 ;兩者目的雖然都是為了解決問題,但本章解決方案聚焦於多數 R程式碼(包括本書程式碼)中常見的技術和用語。如果您初次使用 R ,我建議您略讀本章來熟悉這些用語。

2.1 輸出顯示內容

問題點

您想要在 R軟體中顯示某個變數或表達式的值。

解決方案

若您只在提示符號後輸入變數名稱或表達式,R 軟體會直接輸出、顯示其值。使用print函數能輸出任何物件(包括變數和表達式)值。使用 cat函數則能產生客製化格

式的輸出值。

討論說明

在 R軟體中以指令輸出、顯示結果非常簡單,只需在提示符號後輸入變數名稱或表達式即可,如下所示:

> pi[1] 3.141593

26 | 第二章

> sqrt(2)[1] 1.414214

其中,當輸入表達式後,R軟體會對表達式進行運算,並呼叫 print函數顯示結果。因

此,其輸出結果與下列指令結果相同:

> print(pi)[1] 3.141593> print(sqrt(2))[1] 1.414214

print函數的優點在於它知道如何格式化任何 R輸出值的顯示結果,包括結構化的值,如矩陣(matrix)與列表(list),如下所示:

> print(matrix(c(1,2,3,4), 2, 2)) [,1] [,2][1,] 1 3[2,] 2 4> print(list("a","b","c"))[[1]][1] "a"

[[2]][1] "b"

[[3]][1] "c"

此指令很實用,因為您總是能使用 print函數檢視資料,而不需要記得特殊的輸出邏

輯,即使對複雜資料結構的輸出也是如此。

但 print函數也有明顯限制:它每次僅能顯示一個物件。若同時輸出、顯示多個物件會

得到下列錯誤訊息:

> print("The zero occurs at", 2*pi, "radians.")Error in print.default("The zero occurs at", 2 * pi, "radians.") : unimplemented type 'character' in 'asLogical'

唯一的解決方式,是經由多次使用 print函數來輸出、顯示多個物件,雖然這或許不是

令人感到滿意的方式:

> print("The zero occurs at"); print(2*pi); print("radians")[1] "The zero occurs at"[1] 6.283185[1] "radians"

2.2 設定變數 | 27

此外,cat函數是 print函數的替代方式之一。它允許您將多個物件結合成一個連續 輸出:

> cat("The zero occurs at", 2*pi, "radians.", "\n")The zero occurs at 6.283185 radians.

需注意的是,cat函數預設在兩個物件項目之間加上空格。若需要換行,您必須加上換

行符號(\n)來結束該行內容。

關於輸出資料類型,cat函數亦能輸出、顯示簡單向量:

> fib <- c(0,1,1,2,3,5,8,13,21,34)> cat("The first few Fibonacci numbers are:", fib, "...\n")The first few Fibonacci numbers are: 0 1 1 2 3 5 8 13 21 34 ...

實務上,使用 cat函數提供使用者更多關於輸出的控制和選擇,這在 R腳本中特別實用。但它也有嚴重的限制,即它無法輸出、顯示複合的資料結構,如矩陣和列表。若嘗

試使用 cat函數顯示矩陣或列表會產生以下錯誤訊息:

> cat(list("a","b","c"))Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat'

延伸資訊

錦囊 4.2關於如何控制輸出格式。

2.2 設定變數

問題點

您想要在一個變數中儲存賦值。

解決方案

使用賦值運算子(<-)進行賦值儲存,而且不需要先宣告變數,如下所示:

> x <- 3

28 | 第二章

討論說明

使用 R的「計算模式」時,計算結果能快速產生。因此,您將會想要定義變數,並將賦值儲存於變數中。此程序可節省不少重複打字輸入時間,並使您的工作更有效率。

在 R軟體中並不需要宣告變數或以其他明顯的方式產生變數,只需要將數值賦予名稱,R將會自動產生變數:

> x <- 3> y <- 4> z <- sqrt(x^2 + y^2)> print(z)[1] 5

值得注意的是,賦值運算子是由一個小於符號(<)和連字符(-)構成,兩個符號中間

沒有空格。

當您使用此方式定義變數時,變數會被儲存至目前的工作空間(workspace)中。工作

空間僅暫存於電腦的主記憶體中,但是退出 R軟體時,使用者可選擇將它另存至電腦硬碟中。工作空間會保存該變數定義,直到使用者移除變數。

R屬於一種動態型別語言(dynamically typed language),這代表它允許改變變數的資料

類型。我們可以先將 x設定為數值變數,然後隨即將它改為字元字串的向量;R具有如此彈性:

> x <- 3> print(x)[1] 3> x <- c("fee", "fie", "foe", "fum")> print(x)[1] "fee" "fie" "foe" "fum"

有時候,在某些 R函數中,您會看到特別不一樣的賦值符號 <<-:

x <<- 3

這個指令強制賦值給一個總體變數(global variable),而不是局部變數(local variable)。

基於提供充分資訊的理念,我將介紹另外兩種 R支援的賦值形式。其一為單一等號(=)。其二,只要向左賦值符號(<-)可適用之處,向右賦值符號(->)也可以被用於

賦值:

> foo = 3> print(foo)

2.3 列出變數 | 29

[1] 3> 5 -> fum> print(fum)[1] 5

然而,前述兩種賦值方法並未於本書中廣泛使用;而且,我也推薦讀者盡量避免使用。

因為等號賦值很容易與假設檢定中的等號混淆。此外,向右賦值不但非常少見,而且當

表達式很長時,反而影響易讀性。

延伸資訊

錦囊 2.4、錦囊 2.14,與錦囊 3.2。亦可參考關於 assign函數的輔助頁面。

2.3 列出變數

問題點

您想知道目前有哪些已定義的變數和函數儲存於工作空間中。

解決方案

使用 ls函數,或者使用 ls.str函數得知每個變數的細節。

討論說明

ls函數顯示目前工作空間中所有物件(objects)的名稱:

> x <- 10> y <- 50> z <- c("three", "blind", "mice")> f <- function(n,p) sqrt(p*(1-p)/n)> ls()[1] "f" "x" "y" "z"

請注意 ls函數回傳的結果是個字串組成的向量,其中每個字串代表一個變數或函數名

稱。當工作空間沒有任何已定義的變數時,ls會回傳一個空向量,產生令人困惑的輸出

結果如下:

> ls()character(0)

30 | 第二章

由此可見,R以如此的輸出結果向使用者顯示,ls函數回傳一個長度為零的字串向量,

即空向量,因為工作空間中沒有任何已定義的變數。

若您想要取得除了名稱列表以外的資訊,則使用 ls.str函數;它會回傳關於每個變數的

資訊:

> ls.str()f : function (n, p)x : num 10y : num 50z : chr [1:3] "three" "blind" "mice"

此函數名為 ls.str的原因在於,它既列出所有變數名稱,又應用 str函數至所有變數,

顯示它們的結構(細節請參考錦囊 12.15)。

一般而言,ls函數不會回傳任何點(.)開頭的變數名稱,因為這種變數通常被視為

隱藏變數,不是使用者感興趣的重點(此慣例沿用 Unix系統不列出開頭為點的檔案名稱)。但在 R軟體中,仍可經由設定引數 all.names為 TRUE,來強制 ls函數列出所有 變數:

> .hidvar <- 10> ls()[1] "f" "x" "y" "z"> ls(all.names=TRUE)[1] ".hidvar" "f" "x" "y" "z"

延伸資訊

錦囊 2.4關於刪除變數,以及錦囊 12.15檢視某一變數。

2.4 刪除變數

問題點

您希望刪除工作空間中不需要的變數和函數,或者徹底刪除它們的內容。

解決方案

使用 rm函數。

2.4 刪除變數 | 31

討論說明

使用 R的過程中,您的工作空間可能很快就變得雜亂。rm函數能將一個或多個物件從工

作空間中永久地移除,如下所示:

> x <- 2*pi> x[1] 6.283185> rm(x)> xError: object "x" not found

需注意的是,此指令執行後並無法「復原」;換言之,一旦變數被刪除,則無法復原。

若有需要,您可以一次移除多個變數:

> rm(x,y,z)

您甚至可以刪除整個工作空間的所有內容。rm函數中有個 list引數,用來設定欲刪除

變數名稱組成的向量。記得前面介紹過 ls函數能回傳所有變數名稱組成的向量;結合

rm與 ls函數,即可刪除工作空間中的所有變數:

> ls()[1] "f" "x" "y" "z"> rm(list=ls())> ls()character(0)

保持禮貌

透過郵件列表與其他人分享 R程式碼範例時,絕不能將含有 rm(list=ls())的程

式碼納入。藉由此方式惡意刪除某人工作空間的所有變數是極粗魯的行為,也將

會讓您變得不受歡迎。

延伸資訊

錦囊 2.3。

32 | 第二章

2.5 產生向量

問題點

您想要產生一個向量。

解決方案

使用 c(...)指令以給定值來建構向量。

討論說明

向量不僅是資料結構類型之一,也是 R的重要組成元素。向量可以包含數值、字串,或邏輯值,但不能由多種資料型態混合組成。

使用 c(...)運算子,能以簡單的同類型資料建構向量,如下所示:

> c(1,1,2,3,5,8,13,21)[1] 1 1 2 3 5 8 13 21> c(1*pi, 2*pi, 3*pi, 4*pi)[1] 3.141593 6.283185 9.424778 12.566371> c("Everyone", "loves", "stats.")[1] "Everyone" "loves" "stats."> c(TRUE,TRUE,FALSE,TRUE)[1] TRUE TRUE FALSE TRUE

若 c(...)括弧中的引數本身是向量,它會將資料扁平化,並結合多個向量成為單一向量:

> v1 <- c(1,2,3)> v2 <- c(4,5,6)> c(v1,v2)[1] 1 2 3 4 5 6

如前所述,向量不能由多種資料格式(如數字與字串)混合組成,若您產生一個含有混

合資料型態的向量,R將會進行轉換處理,如下所示:

> v1 <- c(1,2,3)> v3 <- c("A","B","C")> c(v1,v3)[1] "1" "2" "3" "A" "B" "C"

2.6 計算基本統計量 | 33

其中,我們將一組數字與一組字串合併產生一個新向量。R在產生新向量之前,會將所有數值資料轉換成字串,而使資料型態一致。

技術上而言,兩種資料元素能共存於一個向量的前提是,它們具有相同的型態

(mode)。例如,3.1415和 "foo"的型態分別為數值型和字元型:

> mode(3.1415)[1] "numeric"> mode("foo")[1] "character"

上例顯示兩者的資料型態不同。然而,如下所示,為了產生新向量,R軟體將 3.1415轉換為字元型態,使得 3.1415的資料型態與 "foo"的資料型態一致而能相容:

> c(3.1415, "foo")[1] "3.1415" "foo"> mode(c(3.1415, "foo"))[1] "character"

c是個通用的運算子,這指的是它不僅能應用於向量,也適用於其他資料

型態。但是,它有時可能無法精確達成預期結果;因此,應用 c運算子至

其他資料型態或物件前,需先檢查確認其輸出結果。

延伸資訊

第 5章的「簡介」,有關於向量和其他資料結構的內容。

2.6 計算基本統計量

問題點

您想要計算基本統計量,如:平均數、中位數、標準差、變異數、相關係數,或共變 異數。

解決方案

使用下列函數進行計算,並假設 x與 y為向量:

• mean(x)

• median(x)

34 | 第二章

• sd(x)

• var(x)

• cor(x, y)

• cov(x, y)

討論說明

記得我第一次開啟 R的輔助文件,是為了尋找「計算標準差的程序」。我原以為輔助文件會以整個章節的篇幅介紹這個重要概念。

但實際上沒那麼複雜。

使用簡單函數即可完成標準差和其他基本統計量的計算。一般而言,函數的引數是一組

數字組成的向量,而函數會回傳計算的統計結果:

> x <- c(0,1,1,2,3,5,8,13,21,34)> mean(x)[1] 8.8> median(x)[1] 4> sd(x)[1] 11.03328> var(x)[1] 121.7333

其中,sd函數計算樣本標準差,而 var函數計算樣本變異數。

而 cor函數與 cov函數分別計算兩個向量間的相關係數與共變異數:

> x <- c(0,1,1,2,3,5,8,13,21,34)> y <- log(x+1)> cor(x,y)[1] 0.9068053> cov(x,y)[1] 11.49988

上述這些函數對於遺失值(NA)十分敏感。即使向量中只有一個遺失值,也會導致這些函數回傳 NA,嚴重時甚至可能發生錯誤,而使電腦運算完全停止:

> x <- c(0,1,1,2,3,NA)> mean(x)[1] NA> sd(x)[1] NA

2.6 計算基本統計量 | 35

實際上,R軟體對於遺失值處理的謹慎,有時反而造成使用者的困擾。然而,這種處理方式是正確的。您必須仔細思考評估情況:資料中的遺失值是否可能導致統計結果無

效?如果答案是肯定的,那麼 R軟體的謹慎是必要的;如果答案是否定的,您可以透過設定參數 na.rm=TRUE要求 R忽略 NA值。

> x <- c(0,1,1,2,3,NA)> mean(x, na.rm=TRUE)[1] 1.4> sd(x, na.rm=TRUE)[1] 1.140175

平均數 mean函數及標準差 sd函數的美妙之處在於它們善於處理資料框架。它們瞭解資

料框架的每一行代表不同的變數,因此分別計算每行資料的統計量。以下範例顯示包含

三個變數的資料框架,並計算其平均數和標準差的統計量:

> print(dframe) small medium big1 0.6739635 10.526448 99.836242 1.5524619 9.205156 100.708523 0.3250562 11.427756 99.732024 1.2143595 8.533180 98.536085 1.3107692 9.763317 100.744446 2.1739663 9.806662 98.589617 1.6187899 9.150245 100.467078 0.8872657 10.058465 99.880689 1.9170283 9.182330 100.4672410 0.7767406 7.949692 100.49814> mean(dframe) small medium big 1.245040 9.560325 99.946003> sd(dframe) small medium big 0.5844025 0.9920281 0.8135498

其中,mean和 sd函數分別回傳三個值,每個數值對應資料框架所定義的變數資料統計

量(技術上而言,R回傳一個由三元素組成的向量,其中每個元素的 names屬性來自資

料框架的變數名稱)。

同樣地,var函數能讀取資料框架,但其處理方式卻與 mean及 sd函數不同。它計算資

料框架中每兩行變數間的共變異數,並回傳共變異數矩陣的輸出結果:

> var(dframe) small medium bigsmall 0.34152627 -0.21516416 -0.04005275medium -0.21516416 0.98411974 -0.09253855big -0.04005275 -0.09253855 0.66186326

36 | 第二章

若 x是個資料框架或矩陣,則 cor(x)函數回傳其相關係數矩陣,而 cov(x)函數回傳其

共變異數矩陣:

> cor(dframe) small medium bigsmall 1.00000000 -0.3711367 -0.08424345medium -0.37113670 1.0000000 -0.11466070big -0.08424345 -0.1146607 1.00000000> cov(dframe) small medium bigsmall 0.34152627 -0.21516416 -0.04005275medium -0.21516416 0.98411974 -0.09253855big -0.04005275 -0.09253855 0.66186326

不過,median函數無法處理資料框架形式的資料。若要計算資料框架變數的中位數,可

使用錦囊 6.4介紹的方法,分別對每行資料進行計算。

延伸資訊

錦囊 2.14,錦囊 6.4,與錦囊 9.17。

2.7 產生序列

問題點

您想要產生一組數字序列。

解決方案

使用 n:m表達式產生簡單數字序列 n、n+1、n+2、⋯、m:

> 1:5[1] 1 2 3 4 5

使用 seq函數,可產生數字間隔不為 1的序列,如下所示:

> seq(from=1, to=5, by=2)[1] 1 3 5

而使用 rep函數,則產生由重複數值組成的序列:

> rep(1, times=5)[1] 1 1 1 1 1

2.7 產生序列 | 37

討論說明

冒號運算子(n:m)可產生包含 n、n+1、n+2、⋯、m序列的向量:

> 0:9 [1] 0 1 2 3 4 5 6 7 8 9> 10:19 [1] 10 11 12 13 14 15 16 17 18 19> 9:0 [1] 9 8 7 6 5 4 3 2 1 0

值得注意的是,針對上列最後一個表達式(9:0),R軟體很聰明地偵測出 9大於 0,因而以遞減的順序產生序列。

原則上,冒號運算子只適用於產生增量為 1的數列,但 seq函數能支援以第三個引數,

設定序列的增量值,而產生增量超過 1的數列:

> seq(from=0, to=20) [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20> seq(from=0, to=20, by=2) [1] 0 2 4 6 8 10 12 14 16 18 20> seq(from=0, to=20, by=5)[1] 0 5 10 15 20

另外一種方式為,設定函數輸出數列的長度,R軟體將會自動計算需產生的增量數列:

> seq(from=0, to=20, length.out=5)[1] 0 5 10 15 20> seq(from=0, to=100, length.out=5)[1] 0 25 50 75 100

此外,函數的增量數不需要是整數;R也能產生增量為分數的數列:

> seq(from=1.0, to=2.0, length.out=5)[1] 1.00 1.25 1.50 1.75 2.00

特殊情況下,若需要建立重複數值的「序列」,應該使用 rep函數,以產生重複第一個

引數值的序列:

> rep(pi, times=5)[1] 3.141593 3.141593 3.141593 3.141593 3.141593

延伸資訊

錦囊 7.14關於產生日期物件(Date objects)序列。