這裡介紹 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
所建立的向量,其內部的值都是 0
、FALSE
或 NULL
這類的空值。對於一些常用的變數類型,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.int
跟 seq
類似,可以產生一般的數值序列,但其執行效率較高。
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