序列的產生
R 有一系列的方式可產生常用的序列(sequence),例如要產生 c(1, 2, 3, ..., 100)
,則可使用冒號運算子(:
):
seq <- 1:100
以下是一些相關的用法,讀者可以比較其中的差異。
seq1 <- 30:1 seq2 <- 1:10 * 2 + 1 n <- 10 seq3 <- 1:n-1 seq3 <- 1:(n-1)
seq()
函數是在產生數列時最為常用的工具,前兩個參數分別指定所產生數列的首尾,如果只是給定這兩個值,則和冒號運運算子的結果完全一樣,例如:seq(2, 10)
就等同於 2:10
。
seq()
的參數和其他許多 R 函數的參數一樣都可以用指定名稱的方式給定,在這情況下,參數的順序可以是任意改變的,所以前兩個參數就可以用 from=value
與 to=value
的方式設定,因此以下幾種寫法是完全一樣的:
seq(1, 30) seq(from = 1, to = 30) seq(to = 30, from = 1) 1:30
seq()
接下來的兩個參數是 by=value
與 length=value
,它們分別表示這個序列的步長和長度,如果二者都沒有設定,那麼預設值就是 by=1
(步長為 1
)。例如
seq1 <- seq(-5, 5, by = 0.2)
所得到的 seq1
為 c(-5.0, -4.8, -4.6, ..., 4.6, 4.8, 5.0)
,類似的用法
seq2 <- seq(length = 51, from = -5, by = 0.2)
得到的 seq2
與 seq1
相同。
還有一個相關的函數是 rep()
。它可以用各種複雜的方式重複一個物件,簡單的方式就是
rep1 <- rep(x, times = 3)
這種方式會先把 x
複製三次並保持 x
的序列順序,逐一放在 rep1
中,得到 c(1, 2, 3, 1, 2, 3, 1, 2, 3)
。另一種方式是
rep2 <- rep(x, each = 3)
這是把 x
中的每個元素都重複三次,然後將重複三次的元素逐一放入,得到 c(1, 1, 1, 2, 2, 2, 3, 3, 3)
。
邏輯向量
邏輯向量(logical vector)就是由邏輯元素所構成的向量,每個元素可以被賦予的值有 TRUE
、FALSE
與 NA
(見下一小節)。
TRUE
與 FALSE
可以分別簡寫為 T
和 F
,但要注意的是 R 對 T
和 F
的處理方式只是預設將他們設為 TRUE
和 FALSE
的變數,它們不是系統保留字(reserved word),可以被使用者複寫,因此建議使用者儘量使用 TRUE
和 FALSE
,避免產生不必要的困擾。指定一個邏輯向量的方式與一般數值向量一樣是使用 c()
,例如:
b <- c(TRUE, FALSE, TRUE)
邏輯向量亦可以由條件式(conditions)產生,例如:
x <- c(1, 2, 3, 4) bseq <- x < 3
得到的 bseq
是一個長度與 x
一致的向量,其中每個元素就是 x
向量中每個元素經過邏輯運算的結果,亦即 c(TRUE, TRUE, FALSE, FALSE)
。
R 的比較運算子包含:
<
:小於。<=
:小於或等於。>
:大於。>=
:大於或等於。==
:等於。!=
:不等於。
假設 b1
與 b2
是兩個邏輯向量,以下是 R 的邏輯運算子與使用方式:
&
:AND 邏輯運算子,如b1 & b2
。|
:OR 邏輯運算子,如b1 | b2
。!
:NOT 邏輯運算子,如!b1
。
若將邏輯變數使用於一般的算術運算中,邏輯變數將會被強制轉換成數值變數,FALSE
轉換為 0
,而 TRUE
轉換為 1
。
遺失值
在某些情況下,向量的某些元素有可能無法得知,當一個元素或是數值在統計上無法獲得(not available)或是遺失(missing value)的時候,則此元素或數值就會以一個特定的值 NA
來表示,任何含有 NA
資料的運算結果都將是 NA
,會這樣假設的道理很簡單,如果計算用的資料都是未知的,那麼結果也必然是不可預期的,因此也是不可得到的。
is.na(x)
函數返回一個和 x
同樣長度的邏輯向量,若其某個元素值為 TRUE
則表示在 x
中對應元素為 NA
。
z <- c(1:3, NA) ind <- is.na(z)
x == NA
與 is.na(x)
是完全不同的,因為 NA
不是一個真實的值,而是一個表示某個資料值無法得知的符號,因此 x == NA
得到的是一個長度和 x
一樣的向量,而它的所有元素的值都是 NA
,因為該邏輯運算式本身就包含 NA
,所以運算結果也都是 NA
。另外還要注意數值計算會產生第二種遺失值,也稱為非數值(Not a Number)NaN
,例如:
0/0
或者
Inf - Inf
二者都得到 NaN
,這是因為它們的結果都無法定義。其中 Inf
代表數學上的無窮大。
若用 is.na()
檢查 NA
與 NaN
的話,結果都會是 TRUE
,若需要區分它們,可以使用 is.nan()
來檢查,is.nan()
只有對 NaN
元素會產生 TRUE
。