這裡介紹 R 向量的詳細使用方式,以及如何運用矩陣與陣列處理高維度的資料。

向量(Vectors)

在 R 中要建立向量最常使用的方式就是使用 c 函數,例如:

c(1, 3, 5)
[1] 1 3 5

另外使用冒號運算子(:)也是很常用的向量建立方式:

1:5
[1] 1 2 3 4 5

除了整數向量之外,它也可以產生浮點數的向量:

4.3:8.3
[1] 4.3 5.3 6.3 7.3 8.3

合併各種向量,產生更長的新向量:

c(1:4, 8, 9, c(12, 23))
[1]  1  2  3  4  8  9 12 23

vector 函數可以用來建立特定類型與長度的向量,例如:

vector("numeric", 3)
[1] 0 0 0
vector("logical", 3)
[1] FALSE FALSE FALSE
vector("character", 3)
[1] "" "" ""
vector("list", 3)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

使用 vector 所建立的向量,其內部的值都是 0FALSENULL 這類的空值。對於一些常用的變數類型,R 提供了比較簡潔的函數方便使用者呼叫:

numeric(3)
[1] 0 0 0
logical(3)
[1] FALSE FALSE FALSE
character(3)
[1] "" "" ""
list 並沒有提供類似的簡潔函數,執行 list(3) 所得到的結果跟這裡所預期的不同。

序列(Sequences)

冒號運算子可以讓我們快速建立簡單的向量,如果需要產生較複雜的向量,在 R 中有一系列的相關函數可以使用。

seq 是一個可產生各種序列的函數,例如:

seq(2, 5)  # 等同於 2:5
[1] 2 3 4 5

seq 的步長可以使用 by 參數指定:

seq(2, 5, by = 0.5)
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0

也可以使用 length 指定序列的長度,讓 seq 自動計算步長:

seq(2, 5, length = 5)
[1] 2.00 2.75 3.50 4.25 5.00

以下是一些 seq 的使用範例:

seq(10) # 等同於 1:10
seq(from = -5, to = 5, by = 0.2)
seq(length = 51, from = -5, by = 0.2)
seq(1, 9, by = pi)

seq 函數是最一般性的序列產生函數,而 R 中還有幾個跟 seq 相關的函數,專門用於產生特定類型的序列。

seq.intseq 類似,可以產生一般的數值序列,但其執行效率較高。

seq.int(2, 5)
seq.int(2, 5, by = 0.5)
seq.int(2, 5, length = 5)

seq_len 可產生特定長度之序列,比較特別的地方是它可以處理長度為零的序列:

n <- 0
1:n
[1] 1 0
seq_len(n)
integer(0)

seq_along 可以產生一個跟輸入向量相同長度的序列,而序列的內容就是從 1 到輸入向量的長度值,例如:

input <- c("hello", "foo", "bar")
seq_along(input)
[1] 1 2 3

seq_along 比較常見的用法是配合迴圈一起使用:

for(i in seq_along(input)) {
  print(input[i])
}

迴圈的使用我們在後續的教學會說明,這裡只需要有概念即可。

向量長度

所有的向量都有一個長度屬性,記錄該向量所含有的元素數量,我們可以使用 length 函數來檢查向量的長度:

length(1:3)
[1] 3

邏輯向量的用法也相同:

length(c(TRUE, FALSE, NA))
[1] 3

至於字元向量的話,也可以使用 length 來檢查向量的長度:

str <- c("hello", "foo", "bar")
length(str)
[1] 3

length 函數所顯示的是向量中有幾個元素,如果想要知道字串的長度,可以使用 nchar 函數來計算:

nchar(str)
[1] 5 3 3

length 也可以讓使用者直接改變向量的長度屬性,但這樣的做法比較不常使用,而且會讓程式碼不易閱讀。如果將向量的長度降低,超出向量長度的元素會被直接移除:

x <- 1:10
length(x) <- 3
x
[1] 1 2 3

而如果增加向量的長度,多出來的元素都會是 NA

length(x) <- 6
x
[1]  1  2  3 NA NA NA
在處理大量運算,需要預先配置記憶體時,有時候就會使用增加向量長度的方式來處理。