字元向量
字元向量(character vector)是由字元所構成的向量,而字元的表示方式是以雙引號夾著一序列的字元,例如 "x-values"
、"New iteration results"
,要指定一個字元向量也是使用 c()
函數:
str <- c("string 1", "string 2")
在 R 中常常會用到字元向量,例如繪圖時的標題或註解等。
字串輸入的時候也可以用單引號,所以也可以這樣寫:
str <- c('string 1', 'string 2')
但是 R 在輸出的時候則採用雙引號(或者有時不用引號)。
R 對字元的的處理採用 C 語言形式的跳脫序列(escape sequences),因此使用者可以透過跳脫序列輸入一些特殊字元,例如:
\n
:換行字元。\t
:Tab 字元。\b
:退位鍵(backspace)。\"
:雙引號("
)。\\
:反斜線(\
)。
在 R 中所謂的字元事實上就等於在一般語言中的字串(string),也就是說以下這些在 R 中都稱為字元(character):
""
:空字元。"a"
:包含一個字母的字元。"string"
:包含多個字母的字元。"Hello World!\n"
:包含轉義控制序列的字元。
在處理字元時最常用的函數之一就是 paste()
,它可以傳入任意多的參數,然後將每個參數轉換成字元,並且把它們一個接一個地串接起來,例如:
x <- 10 str <- paste("x=", x)
paste()
在串接字元時預設使用的分隔符號是一個空白字元,若要指定分隔符號可以使用 sep="string"
參數,例如:
x <- 10 str <- paste("x", x, sep = "-")
sep
也可以指定為空字元,例如:
labs <- paste(c("X", "Y"), 1:10, sep = "")
這裡較短的向量 c("X", "Y")
重複了五次以符合向量 1:10
的長度,得到的 labs
為 c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")
。
索引向量
若要存取向量的某個元素,可透過中括號([]
)使用索引向量(index vector)的方式存取,索引向量的使用方式有四種,以下分別介紹各種使用方式。
邏輯向量
這種情況下,索引向量與被挑選元素向量的長度必須一致,被挑選元素向量中對應索引向量為 TRUE
的元素將會被選出,而那些對應 FALSE
的元素則被忽略。例如:
x <- c(1, 2, NA,4) y <- x[!is.na(x)]
這會將 x
向量中非 NA
的元素選出來,依照原本的順序指定給 y
,若 x
中包含 NA
元素,則所得到的 y
向量長度就會比 x
向量的長度短。以下是另一個較複雜的例子:
x <- c(0, -1, -2, NA, 4, 6) x <- x + 1 z <- x[(!is.na(x)) & x > 0]
這個例子首先把 x
每個元素都加一,然後選出非 NA
且大於 0
的元素,依照原本的順序指定給 z
。
正整數向量
這種情況下,索引向量中的每個元素必須是 {1, 2, ..., length(x)}
的其中一個(length(x)
為向量 x
的長度),索引向量中索引對應的元素將會被選出,並且依照索引向量中的順序傳回,這種索引向量的長度沒有限制,所選出的向量長度會與索引向量的長度相同, 例如:
x[6]
表示 x
的第 6
個元素,此外
x <- 10:20 y <- x[1:5] z <- x[ c(1, 2, 3, 1, 2, 3) ]
所得到的 y
為 x
的前 5
個元素,而 z
則為 c(10, 11, 12, 10, 11, 12)
。更複雜的例子:
labs <- c("x", "y")[rep(c(1, 2, 2, 1), times = 4)]
這樣會產生一個長度為 16
、由 "x", "y", "y", "x"
重複四次而構成的向量。rep()
為重複某個向量的函數。
負整數向量
這種索引向量與正整數向量規則一樣,負數的意思是將指定的元素排除,將剩餘的元素選出,例如:
x <- 10:20 y <- x[-(1:5)]
所得到的 y
向量為 c(15, 16, 17, 18, 19, 20)
。
字串向量
這種索引向量只能用在可以用 names
屬性區別其元素的向量,在使用之前必須以 names()
函數先設定 names
屬性,例如:
fruit <- c(5, 10, 1, 20) names(fruit) <- c("orange", "banana", "apple", "peach") lunch <- fruit["apple"]
使用字串向量的好處就是容易記,這在使用 data frames 的時候效果比較明顯。
索引運算式也可以用在指定向量的元素上,在這種情況下只有那些被索引向量指定的元素會被更動,例如:
x <- c(1, 2, NA, NA, 3) x[is.na(x)] <- 0
這樣只會將 x
向量中的 NA
元素設為 0
,其餘的元素不變。而
y <- c(-1, -2, 0, 1, 2) y[y < 0] <- -y[y < 0]
是將 y
取絕對值,與下面這個作法相同
y <- c(-1, -2, 0, 1, 2) y <- abs(y)