vector

  • 上週實習課使用 R 時,指令的回傳值多半只有「一個」。但 R 其實是一種以向量作為基本單位的程式語言,所以對於「一個回傳值」更精確的描述應該是「一個長度為 1 的向量」。

    #> [1] 2
    #> [1] TRUE
    #> [1] 1
  • 我們上週簡短提過以 : 製造數列的方式 (e.g. 1:10)。事實上,這個回傳的數列即是一個 vector。另外,由於這個 vector 的每個元素皆是整數,因此這個 vector 屬於 integer vector。我們可以使用 typeof() 確認 vector 的類別

    #> [1] "integer"
  • R 裡面的 vector 可以被分成 6 種類別,其中常見的 4 種分別為 integer, double, , character, logical

integer vector

  • integer vector 的元素由整數組成,它可以是零、正或負的。除了使用 : 製造數列,也可以使用 c() (稱為 concatenate) 組出任意序列的 vector。
    • 使用 c() 製造 integer vector 時,每個整數數字後面必須接 L,若沒有加上 L, R 會將製造出來的 vector 視為 double vector。
#> [1] -1  5  2
#> [1] -1  5  2
#> [1] "integer"
#> [1] "double"

double vector

  • double vector 儲存的是浮點數,亦即含有小數點的數字 (e.g 1.2, -0.75)

  • 在 R 裡面,integer vector 與 double vector 合稱為 numeric vector,兩者之間的區隔通常也不太重要,因為 R 在運算時,通常會將這兩種資料類型自動轉換成合適的類型

    #> [1] "integer"
    #> [1] "double"
    #> [1] TRUE
    #> [1] TRUE
    #> [1] "double"
    #> [1] "double"
  • Special values:
    • Inf: 代表無限大
    • NaN: “Not a Number”,常見於數字運算不符數學定義時,例如:

      #> Warning in log(-1): NaNs produced
      #> [1] NaN
      #> [1] NaN
      #> [1] NaN

character vector

logical vector

NA

Recycling

  • 兩個或兩個以上的 vector 進行運算時,通常是以 element-wise 的方式進行。此時,若進行運算的 vector 長度不相同,例如,c(1, 2, 3) + 2, R 會自動將長度較短 vector (2) 「回收 (recycle)」,亦即,重複此向量內的元素使其「拉長」到與另一個 vector 等長;接著再將兩個一樣長的 vector 進行 element-wise 的向量運算。
#> [1] 3 3 4 4
#> [1] 3 3 4 4
#> [1] FALSE FALSE  TRUE  TRUE
#> [1] FALSE FALSE  TRUE  TRUE
#> [1] "a1"
#> [1] "a1" "b1" "c1"

Coercion

Rules of Coercion

Rules of Coercion

  • if coercion failed, throw error

  • manual coercion: as.character(), as.logical(), as.numeric()

#> [1] 3
#> [1] 2
#> [1] 0.5

Subsetting a vector

  • 有 3 種方法可用於取出 vector 裡面的元素 (回傳一個新的 vector)
    1. 透過提供 vector 中元素的位置次序 (index)
    2. 透過一個與此 vector 等長的 logical vector。在 logical vector 中的相對應位置,以 TRUEFALSE 表示是否保留該位置的元素
    3. 透過提供元素的「名字」(i.e. names 屬性)

index subsetting

#>  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
#> [1] "A"
#> [1] "A" "B" "C" "D" "E"
#> [1] "A" "C" "E"
#>  [1] "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V"
#> [18] "W" "X" "Y" "Z"

Modifying Values in vector

#>  [1] "a" "b" "c" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
#> [1] "male" "male" "f"    "f"
#> [1] "male"   "male"   "female" "female"
#>     john    jenny     jane     kate 
#>   "male"   "male" "female" "female"
#>     john    jenny     jane     kate 
#>   "male"   "male" "female" "female"
#>     john    jenny     jane     kate 
#>   "male" "female" "female" "female"

if else

  • 一般而言,R 是由上至下一行一行地執行程式碼。有時候我們會希望能跳過某些程式碼或是依據不同的狀況執行不同的程式碼,這時候我們就需要使用條件式
#> [1] "x is positive"
#> [1] "x is negative"
#> [1] "This is always printed"

配合課本