http://netstat.stat.tku.edu.tw
(User from: 54.162.218.214)
機率  |  統計  |  Data Mining  |  資料處理  |  DEMO  |  Data  |  Links  |  Books  |  相關文件  |   ( ENGLISH )

Home

機率
 計算/查表
 隨機亂數
 Density plots
統計
 基本統計
 卡方檢定
 迴歸分析
 ANOVA
 時間數列
 多變量分析
 品質管制
 無母數方法
Data Mining
 決策樹
 Logistic
 判別分析
 集群分析
 類神經網路
 關聯規則分析
 ALL Methods

R 軟體入門: 1.基本概念與操作

by Steve Chen ( , 版權所有, 歡迎散佈)

前言 : 知道 R 這套軟體已經一兩年了, 但是真正 用 R 寫正式的應用程式是最近的事. 我應該還算是個 R 的初學者. 在這篇文章中, 舉例的程式在某些 R 的行家看來, 可能稍嫌粗糙. 不過, 這是拋磚引玉, 我是磚 :)  非常歡迎大家提出指正, 讓更多的人來使用 R

1-1 R 的特色

  • R 是一個程式語言, 不是統計專用軟體. 所以, 在學習 R 語言之前, 不要認為我們可以跟使用 SAS 或 SPSS 一樣, 用滑鼠點選幾下就可以 完成統計分析工作.

  • R 語言的基本要素是向量 (vector), 不是數目 (scalar). 因此, 以向量或矩陣 的運算來說, 在其他程式語言中往往需要使用多個迴圈來完成運算, 但在 R 中 通常只需 1 行程式碼就可以解決.

  • R 的圖形功能與數學,機率,統計,工程等科學運算運算功能很強. 更棒的是, 有很多熱心的 R 支持者 會經常更新,增加新的 R 程式來擴充 R 的功能. 這些新程式擴充的速度, 是諸多商業 統計軟體所遠遠不及的.

  • R 不是封閉的環境. R 程式可以呼叫外部的 C 程式或 Fortran 程式, 隨時補助 R 本身不足的功能

  • R 跟 商業統計/科學運算軟體 S-Plus 都是根基於 S 語言. 多數可以在 S-Plus 上 執行的程式, 都可以在 R 上面正常運算.

  • R 是專為科學運算而存在的軟體. 因此, R 中有不少其他程式語言所沒有的 資料型態, 例如: 向量 (vector), 陣列 (array), 矩陣 (matrix), 串列 (list), 因子 (factor), 資料框架 (data frame), 時間數列 (ts) ... 等等. 而且, 因為 R 包含了許多熱心人士提供的運算函數, 這些函數對於輸入的變數型態要求不同, 以致於初學者經常會被搞得七暈八素, 往往分不清楚自己的資料是什麼型態, 或是該 轉換成什麼型態. 這份文件的目的, 就是希望能縮短這樣的困惑期.

  • R 的主要網站上提供了許多熱心人士所寫的英文教學文件. 可惜的是, 這些文件 通常過於簡略, 多半缺乏 "從輸入個人資料 ==> 完成機率統計運算" 的操作性說明. 這些文件中的 "範例", 往往是作者早就準備好為某個運算函數而存在的資料檔, 跳過資料輸入或轉換的步驟, 直接呼叫函數. 看似簡單, 但初學者要分析自己的資料時, 就常會不知所措, 這也是我在寫這個網站的程式時所碰到的困擾. 因此, 我將以這個 網站上的一些統計分析網頁為例, 盡量詳述從資料輸入/匯入 到 完成運算的完整過程.
1-2 開始行動

執行 R 的方式分兩種: 交談互動式輸入 與 批次執行 (batch mode). R 有 Unix, 麥金塔, 以及 Windows 版本, 但是主要介面都是交談互動式輸入.

要進入 R 的互動模式, 通常都是直接輸入 R 這個英文字. 以下是在 Linux 作業系統 中進入 R 的畫面:

/home/john> R

R : Copyright 2002, The R Development Core Team
Version 1.4.1  (2002-01-30)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type `license()' or `licence()' for distribution details.

R is a collaborative project with many contributors.
Type `contributors()' for more information.

Type `demo()' for some demos, `help()' for on-line help, or
`help.start()' for a HTML browser interface to help.
Type `q()' to quit R.

>
這裡我們要稍停一下, 先記得 q( ) (括號間沒有空格) 是離開 R 的指令 :)
(Note: 我曾經被 "困" 在 Emacs 編輯器中長達 20 分鐘, 因為找不到 如何離開的按鍵組合, 從此痛恨 Emacs, 不想再使用它 )

● 1-2-1 簡單數字運算 :

> 1+1
[1] 2
> 1*3.4
[1] 3.4
> 1/2
[1] 0.5
> 1/2.0
[1] 0.5
> 1.0/2.0
[1] 0.5
> cos(1)
[1] 0.5403023
> cos(1.0)
[1] 0.5403023
□ 在 R 語言中, 所有的數目都具有雙倍精確度 (double precision), 所以 1/2, 1.0/2, 跟 1/2.0 的結果是一樣的.

● 1-2-2 向量 (vector) 運算 :

> x <- c(1,2.0,3)
> x
[1] 1 2 3
> x <- c(1.0,2.3,3)
> x
[1] 1.0 2.3 3.0
> x <- c(1,2,3.0)
[1] 1 2 3
> x+1
[1] 2 3 4
> x-1.2
[1] -0.2  0.8  1.8
> x*2
[1] 2 4 6
> x*x
[1] 1 4 9
> y = c(4,5,6)
> x*y
[1]  4 10 18
> y*x
[1]  4 10 18
> y = c(4,5,6,7)
> x*y
[1]  4 10 18  7
Warning message:
longer object length
        is not a multiple of shorter object length in: x * y

> # x 變成字串 (string) 向量
> x <- c(1,"123",3)
> x
[1] "1"   "123" "3"
> x + 1
Error in x + 1 : non-numeric argument to binary operator

> x <- c(1,2,3)
> # 連接以上兩個向量
> z = c(x,y)
> z
[1] 1 2 3 4 5 6 7

> # 列出目前為止的所有物件 (object)
> ls()
[1] "last.warning" "x"            "y"            "z"
□ 上面的程式碼中:
  • 以 # 開頭者為註解
  • c(1,2,3) 中的 c 是 combine 函數, 負責將 幾個個別的物件 (object) 結合在一起, 成為 向量 (vector).
  • 向量 (vector) 只能包含 相同 資料型態的物件.
  • 向量 與 向量之間的簡單運算 (+,-,*,/) 是相對位置的元素互相作用的結果.
  • R 中的字串 (string) 以雙引號 (") 包夾而成.
  • 從 R 的最近版本 (1.4.0) 開始, 我們可以使用 = 號來代替 <- 號
  • 在 R 中, 不需要特別用 print 指令來顯示變數內容. 只要直接打入變數或運算式, 就可顯示結果

● 1-2-3 使用 "[ ... ]" 來找出向量中的特定元素 :
(以下, NA 代表遺失值)

> x = c(11,12,13)
> x[2]
[1] 12
> x[4]
[1] NA
> x[c(1,3)]
[1] 11 13
> x[1:2]
[1] 11 12
> x[c(1,2)]
[1] 11 12
> x[c(3)]
[1] 13
> x[3]
[1] 13
> x[c(1,2,3)]
[1] 11 12 13
> x[1:3]
[1] 11 12 13

> y <- x[1:2]
> y
[1] 11 12
> y <- x[1,3]
Error in x[1, 3] : incorrect number of dimensions
> y <- x[c(1,3)]
> y
[1] 11 13
□ 從以上程式可知, 我們可以用 x[1:3] (":" 代表從 1 到 3) 跟 x[c(1,2,3)] 取出相同的元素. 同樣的, 我們也可以用 x[1] 跟 x[c(1)] 取出 x 向量的 第 1 個元素, 但後者是畫蛇添足, 因為 c 函數最好是用在 2 個 或 2 個以上的元素運算.

● 1-2-4 計算一些基本敘述統計量 :
(以下, var 代表變異數, sd 代表標準差) :

> x
[1] 11 12 13
> mean(x)
[1] 12
> max(x)
[1] 13
> min(x)
[1] 11
> var(x)
[1] 1
> median(x)
[1] 12
> sum(x)
[1] 36
> sd(x)
[1] 1
> # 不用 sd 函數, 自己算標準差
> x.sd = sqrt((sum(x*x) - length(x)*mean(x)^2)/(length(x)-1))
> x.sd
[1] 1
> # 不用 sd 函數, 自己算標準差 (簡化運算式)
> # 先算出 x 向量中的元素個數 n
> n = length(x)
> x.sd = sqrt((sum(x^2) - n*mean(x)^2)/(n-1))
> x.sd
[1] 1

> # 寫個計算標準差的小函數來玩玩
> # ( 以下幾行程式碼最前面的 + 是 R 自動加上去的)
> my.sd <- function(y)
+ {
+   n = length(y)
+   kkk = sqrt((sum(y^2) - n * mean(y)^2)/(n - 1))
+   kkk
+ }
> x.sd = my.sd(x)
> x.sd
[1] 1
● 1-2-5 引入外部的程式檔:

在上面幾行中, 我們建立了一個小函數 (function). 這個 函數會隨著 R 的結束而消失. 所以我們可以用文字編輯器將以下幾行存入 一個檔案, for example, myfunction.R :

my.sd <- function(y)
{
   n = length(y)
   kkk = sqrt((sum(y^2) - n * mean(y)^2)/(n - 1))
   kkk
}
然後, 將此檔案放在"目前"執行 R 程式的所在目錄下, 在 R 中使用 source 函數 呼叫進來使用:
> source("myfunction.R")
> x <- c(1,2,3,4,5)
> my.sd(x)
[1] 1.581139
> z <- c(1.4,2.3,11.8,12.5,99)
> my.sd(z)
[1] 41.46667
> my.sd(3*z)
[1] 124.4000

Section 1 Summary:

  • q( ): 離開 R 的互動介面
  • c: combine 函數
  • x[1:3],x[2],x[c(1,3)]: 取出某向量變數 x 的部分元素
  • length(x): 計算 x 向量內的元素個數, sqrt(x): 計算平方根
  • mean,min,max,sum,var,sd: 基本敘述統計函數
  • ls( ): 列出目前為止所創造的 R 物件
  • source("檔名"): 可以將外部的 R 程式碼引入