Chapter 1 - Basic Introduction

Basic Introduction


  • 1. 熟練Rstudio的基本操作包含指運用, 視覺化操作與模擬分析。
  • 2. R為統計領域中使用率最頻繁的軟體之一, TIOBE對全球城市語言排名中R佔第10名, 但由於mac與windows的R介面與快捷鍵不同, 而Rstudio介面相似, 且融入了許多其他程式碼(LaTeX,C,…)與套件(RMarkDown,…), 並介面也較方便, 因此Rstudio的使用率也漸頻繁。

R studio 頁面介紹

  • R studio主要分為四大區塊
  • 1. 左上區為編輯區,若想新增編輯頁面可點選左上角的「+」選R Script(windows快捷鍵為ctrl + shift + N , Mac為 command + shift + N)。
  • 2. 左下區為R的介面,在編輯區塊所執行的指令都會在左下角顯現,也可以在此執行指令。
  • 3. 右上區像是倉庫一樣,儲存了匯入及創造出的資料,執行過的命令也會記錄下來。
  • 4. 右下區則為XXX,可以查看繪製的圖也可以查詢不懂的指令。

1.1 Introduction to R

通常給R 的指令分成兩種,一個 expression,或是一個 assignment。
  • ### Expression
    • 在R中,每一段指令都是一個expression。

    • 輸入有效的 expression 後,R 會執行並且把結果呈現於 Console 中。

  • ### Assignment
    • 物件(object)被assign後,會出現在Environment中。

    • 物件可以是一個變數、數字、文字、向量、函數或是其他更複雜的東西。

  • ### Others
    • 在編輯時可以使用「#」來增加註解,所有在「#」之後輸入的內容都會被R 所略過。

基本數學運算

# 加   ;    減   ;   乘    ;  除    (這些都是Expression)
1 + 3  ; 10 - 8  ; 3 * 2  ; 6 / 3   
## [1] 4
## [1] 2
## [1] 6
## [1] 2
  • 次方、立方、平方根

# 3的平方 ;  3的1/3次方  ; 根號2
3 ^ 2  ;  3 ^ (1/3)  ;  sqrt(2)  
## [1] 9
## [1] 1.44225
## [1] 1.414214
  • exponential

exp(10)     # e = 2.71828... ; 指e ^10
## [1] 22026.47
  • log

# 以e為底取log ; # log2代表以2為底
log(10)     ;    log2(10)
## [1] 2.302585
## [1] 3.321928
  • 特殊字元 \(\pi ; e\)

pi  ;  exp(1)
## [1] 3.141593
## [1] 2.718282
  • 小數位數取捨

# 四捨五入  ;   # 四捨五入到小數點第二位  ;   # 無條件捨去  ;  # 無條件進位  ;  # 取絕對值
round(4.7)  ;  round(4.786, 2)  ;  floor(4.7)  ;  ceiling(4.7)  ;  abs(-4.7)         
## [1] 5
## [1] 4.79
## [1] 4
## [1] 5
## [1] 4.7

基本統計量

x <- c( 1 , 2 , 3 , 4 )    # 也可以寫成 x <- 1:4 (這個就是assignment)
# 總和     # 平均數     # 中位數      # 變異數    # 樣本標準差
sum(x)  ;  mean(x)  ;  median(x)   ;   var(x)   ;    sd(x)     ; summary(x)    
## [1] 10
## [1] 2.5
## [1] 2.5
## [1] 1.666667
## [1] 1.290994
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    1.75    2.50    2.50    3.25    4.00
cumsum(x)     # 累加
## [1]  1  3  6 10
cumprod(x)    # 累乘(可以算階乘)
## [1]  1  2  6 24

Chapter 2 - R的物件

向量(c( ) ; concatenate)

數值向量(numeric vector)

  • eg. 1,2,3
class(c(7,8,9))
## [1] "numeric"

字串向量(character vector)

class(c("葉哥好師","嗨嗨"))
## [1] "character"

布林向量(logical vector)

class(c(TRUE,FALSE))
## [1] "logical"

向量的運算

  • 向量+向量

    • 在 R 中,大部份的運算都是向量式的。
    • 當多組向量在進行運算時,會由相對應位置的元素進行運算。
    • 當相加的兩個向量長度不同時,R會自動重複比較短的向量,補到和較長的向量相同的長度,然後用 一樣的方式去做計算。
c(1,2,3)+c(1:3)
## [1] 2 4 6
2+c(1,2,3)
## [1] 3 4 5
c(1,2)+c(1,2,3,4)
## [1] 2 4 4 6
c(1,3)+c(1,2,3)
## Warning in c(1, 3) + c(1, 2, 3): 較長的物件長度並非較短物件長度的倍數
## [1] 2 5 4
x <- c(1,2,3) ; y <- c(3,6,9)
x+y  ;  x*y  ;  y/x
## [1]  4  8 12
## [1]  3 12 27
## [1] 3 3 3

矩陣(Matrix)

  • Matrix如同線性代數中學的,有列有行,存放一定是數值

  • Matrix可以由一長串的向量去轉換而成,告訴他維度即可

## 1 ~ 12的打法可以打 : 
## == 是用來判斷有沒有相等
1:12
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
(x1 = matrix(1 : 12 ,ncol = 6) )
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12
(x2 = matrix(1 : 12 ,ncol = 6, byrow = T) )
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    2    3    4    5    6
## [2,]    7    8    9   10   11   12
(y1 = matrix(1 : 4 ,nrow = 2) )
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
(y2 = matrix(1 : 4 ,nrow = 2, byrow = T) )
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4

轉置矩陣 與 反矩陣

t(x1)
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8
## [5,]    9   10
## [6,]   11   12
solve(y1)
##      [,1] [,2]
## [1,]   -2  1.5
## [2,]    1 -0.5

矩陣乘法 與 對應元素相乘

x1
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12
t(x1) %*% x1
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    5   11   17   23   29   35
## [2,]   11   25   39   53   67   81
## [3,]   17   39   61   83  105  127
## [4,]   23   53   83  113  143  173
## [5,]   29   67  105  143  181  219
## [6,]   35   81  127  173  219  265
x1 * x1   # t(x1) * x1 不能跑,因為兩個物件維度不一樣
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    9   25   49   81  121
## [2,]    4   16   36   64  100  144

Data Frame

  • Data.frame內存放一大堆變數(向量), 變數間型態可以不同

  • 限制:變數間長度必須一樣

  • 最常使用的物件形式

data <- data.frame(x1=c(1,2,3), #若要換行則此逗號要擺這
                   x2=c('a','b','c'))
data  ;  class(data)
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## [1] "data.frame"
data <- data.frame(x1=c(1,2,3,4), 
                   x2=c('a','b','c'))
## Error in data.frame(x1 = c(1, 2, 3, 4), x2 = c("a", "b", "c")) : 
  arguments imply differing number of rows: 4, 3

Dataframe 的範例

Pro_Filler = c('25%', '50%', '75%') ; Surface = c('S1', 'S2') ; Filler = c('F1', 'F2')
d1 = expand.grid(Pro_Filler, Surface, Filler, 2)
library(splitstackshape)
Data = expandRows(d1, "Var4")
row.names(Data) = NULL
names(Data) = c('Pro_Filler', 'Surface', 'Filler')

y = c(194,208,233,241,265,269,155,173,198,177,235,229,239,187,224,243,243,226,137,160,129,98,155,132)
Data$y = y
Data
##    Pro_Filler Surface Filler   y
## 1         25%      S1     F1 194
## 2         25%      S1     F1 208
## 3         50%      S1     F1 233
## 4         50%      S1     F1 241
## 5         75%      S1     F1 265
## 6         75%      S1     F1 269
## 7         25%      S2     F1 155
## 8         25%      S2     F1 173
## 9         50%      S2     F1 198
## 10        50%      S2     F1 177
## 11        75%      S2     F1 235
## 12        75%      S2     F1 229
## 13        25%      S1     F2 239
## 14        25%      S1     F2 187
## 15        50%      S1     F2 224
## 16        50%      S1     F2 243
## 17        75%      S1     F2 243
## 18        75%      S1     F2 226
## 19        25%      S2     F2 137
## 20        25%      S2     F2 160
## 21        50%      S2     F2 129
## 22        50%      S2     F2  98
## 23        75%      S2     F2 155
## 24        75%      S2     F2 132
a = aov(y~.^3 , Data)
summary(a)
##                           Df Sum Sq Mean Sq F value   Pr(>F)    
## Pro_Filler                 2   5968    2984  11.102 0.001864 ** 
## Surface                    1  26268   26268  97.742 4.05e-07 ***
## Filler                     1   6801    6801  25.305 0.000294 ***
## Pro_Filler:Surface         2   1186     593   2.207 0.152724    
## Pro_Filler:Filler          2   3529    1765   6.566 0.011852 *  
## Surface:Filler             1   3953    3953  14.708 0.002374 ** 
## Pro_Filler:Surface:Filler  2    479     239   0.890 0.435959    
## Residuals                 12   3225     269                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Lists

  • 彈性較大的物件,想像成一種Data.frame,但允許變數長度不同

  • Data.frame 為 List 的一種特例 : 長度相同

lst <- list(A=c(1:5),
            B=c('a','b'))
lst
## $A
## [1] 1 2 3 4 5
## 
## $B
## [1] "a" "b"


  • Dataframe取值

    • 利用[i,j] 來對 dataframe 進行取值的動作,其中, i 為列數、 j 為行數

    • [i,] 表示取出 dataframe 中第 i 列的所有資料,包含所有行變數

    • [,j] 表示取出 dataframe 中第 j 行的所有資料,包含所有列資料

    • $ (錢字號)這裡可以用來挑選特定欄位!記得搭配tab鍵讓你事半功倍!

## Data.frame
data <- data.frame(Date=c('7/23','7/23'),
                   Come=c(T,F),
                   Time=c(3,6))
data
##   Date  Come Time
## 1 7/23  TRUE    3
## 2 7/23 FALSE    6
## 好,我要從data中取出日期的變數(欄位、向量、抽屜)
data$Date ; data[,1]
## [1] 7/23 7/23
## Levels: 7/23
## [1] 7/23 7/23
## Levels: 7/23
## 好,我要從data中取出是否會來的變數(欄位、向量、抽屜)
data$Come ; data[,2]
## [1]  TRUE FALSE
## [1]  TRUE FALSE
## 好,我要從data中取出 '6'
data[2,3]
## [1] 6
  • Lists取值

    • [i]:取出 list 中的第 i 個物件,注意!取出來的物件依舊是 list 結構!

    • [[i]]:取出第 i 個物件中的全部元素,注意![[]]會破壞原本的 list 結構!

    • [[i]][j]:取出第 i 個物件中的第j個元素

    • 若物件已命名,可以利用 $ (錢字號)來提取物件

## List
data <- list(Date=c('7/23','7/24','7/25','7/26'),
             Come=c(T,F),
             Time=c(3,6))
data
## $Date
## [1] "7/23" "7/24" "7/25" "7/26"
## 
## $Come
## [1]  TRUE FALSE
## 
## $Time
## [1] 3 6
## 好,我要從data中取出日期的變數(欄位、向量、抽屜)
## 只是今天衣櫃的每個抽屜長度可以不一樣
data$Date
## [1] "7/23" "7/24" "7/25" "7/26"
data[1]  # 仍然是list格式
## $Date
## [1] "7/23" "7/24" "7/25" "7/26"
data[[1]]
## [1] "7/23" "7/24" "7/25" "7/26"
data[[1]][2]
## [1] "7/24"

特別的物件

  • NA

    • 未來資料中一定常常碰到NA

## NA常常就像這樣任性的存在
x <- c(1,2,3,NA,5)
y <- c(1,2,NA,4,5)
## NA只要碰到加減乘除就會無效
x + y 
## [1]  2  4 NA NA 10
mean(x) 
## [1] NA
## 只要把缺憾移除掉人生就美好多了
mean(x,na.rm=T) 
## [1] 2.75
## 通常NA有規則可以填補我們就會補起來
x[4] <- 4
## 但往往你需要更聰明的方式去補而不是這樣傻傻的數啊 !!
## is.na可以回傳變數哪一個位置為NA
is.na(y)
## [1] FALSE FALSE  TRUE FALSE FALSE
y[ is.na(y) ] <- 3
  • Inf

my.money <- c(0,100,Inf) ; your.money <- c(-Inf,10,0)
my.money+your.money
## [1] -Inf  110  Inf
my.money/your.money ## 我也不知道為什麼 Inf/0會=Inf,可能要問問助教
## [1]   0  10 Inf
  • NaN

    • Not a Number
0/0 ; 1/0-1/0
## [1] NaN
## [1] NaN

Chapter3 - 常用的技巧

        a. 看部分資料

head(iris)  # 設定為看前六行
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

        b. 擷取部分資料

data = iris[1:6, 1:5]
data ; class(data)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
## [1] "data.frame"

        c. 改資料欄位名字

names(data)  #看現在欄位的名字
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"
names(data) = c('花萼長', '花萼寬', '花瓣長', '花瓣寬', '品種')
names(data)
## [1] "花萼長" "花萼寬" "花瓣長" "花瓣寬" "品種"

        d. 新增欄列、刪除欄列

# 刪除第五欄
data[,-5]
##   花萼長 花萼寬 花瓣長 花瓣寬
## 1    5.1    3.5    1.4    0.2
## 2    4.9    3.0    1.4    0.2
## 3    4.7    3.2    1.3    0.2
## 4    4.6    3.1    1.5    0.2
## 5    5.0    3.6    1.4    0.2
## 6    5.4    3.9    1.7    0.4
new = c('a','b','c','d','e','f')
cbind(data, new)  # 增加第六欄
##   花萼長 花萼寬 花瓣長 花瓣寬   品種 new
## 1    5.1    3.5    1.4    0.2 setosa   a
## 2    4.9    3.0    1.4    0.2 setosa   b
## 3    4.7    3.2    1.3    0.2 setosa   c
## 4    4.6    3.1    1.5    0.2 setosa   d
## 5    5.0    3.6    1.4    0.2 setosa   e
## 6    5.4    3.9    1.7    0.4 setosa   f
# 刪除第六列
data[-6,]
##   花萼長 花萼寬 花瓣長 花瓣寬   品種
## 1    5.1    3.5    1.4    0.2 setosa
## 2    4.9    3.0    1.4    0.2 setosa
## 3    4.7    3.2    1.3    0.2 setosa
## 4    4.6    3.1    1.5    0.2 setosa
## 5    5.0    3.6    1.4    0.2 setosa
new = c(5.2 , 3.1, 1.1, 0.3, 'setosa')
rbind(data, new)  # 增加第七列
##   花萼長 花萼寬 花瓣長 花瓣寬   品種
## 1    5.1    3.5    1.4    0.2 setosa
## 2    4.9      3    1.4    0.2 setosa
## 3    4.7    3.2    1.3    0.2 setosa
## 4    4.6    3.1    1.5    0.2 setosa
## 5      5    3.6    1.4    0.2 setosa
## 6    5.4    3.9    1.7    0.4 setosa
## 7    5.2    3.1    1.1    0.3 setosa























        e. 看資料維度 與 資料結構

dim(data)
## [1] 6 5
str(data)  # attributes(data)
## 'data.frame':    6 obs. of  5 variables:
##  $ 花萼長: num  5.1 4.9 4.7 4.6 5 5.4
##  $ 花萼寬: num  3.5 3 3.2 3.1 3.6 3.9
##  $ 花瓣長: num  1.4 1.4 1.3 1.5 1.4 1.7
##  $ 花瓣寬: num  0.2 0.2 0.2 0.2 0.2 0.4
##  $ 品種  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1

        f. 更改某一欄

data$品種 = '某一種花'
data
##   花萼長 花萼寬 花瓣長 花瓣寬     品種
## 1    5.1    3.5    1.4    0.2 某一種花
## 2    4.9    3.0    1.4    0.2 某一種花
## 3    4.7    3.2    1.3    0.2 某一種花
## 4    4.6    3.1    1.5    0.2 某一種花
## 5    5.0    3.6    1.4    0.2 某一種花
## 6    5.4    3.9    1.7    0.4 某一種花

        g. 選取特定的資料(列)

## 選擇 花萼長 >= 5 的資料(列)
(index = data$花萼長 >= 5)
## [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE
data[index,]
##   花萼長 花萼寬 花瓣長 花瓣寬     品種
## 1    5.1    3.5    1.4    0.2 某一種花
## 5    5.0    3.6    1.4    0.2 某一種花
## 6    5.4    3.9    1.7    0.4 某一種花

練習

  • 1. matrix 的製作與運算

    • 大家都知道回歸分析中估計係數常使用最小平方法,公式為\((X^{'}X)^{-1}X^{'}Y\),如果已知\(X\)\(Y\)分別是下面這兩個,請使用R套入公式計算出答案

X  ;  Y
##      [,1] [,2]
## [1,]    1    1
## [2,]    0    2
## [3,]    1    0
##      [,1]
## [1,]   13
## [2,]   -2
## [3,]    1

  • 2. data frame 製作與運用

    • 你能將左邊資料變成右邊資料嗎?
























Chapter4 - 套件介紹

dplyr

rlist

ggplot2