Next: Other types of objects, Previous: Character vectors, Up: Simple manipulations numbers and vectors
一個向量的子集(subset)元素可以通過向量名後面的方括號中 加入 索引向量 得到。如果一個運算式的結果是向量,則 我們可以直接在運算式的 末尾方括號中加入索引向量以 得到結果向量的子向量(如果有的話)。
這種索引向量可以採用下面四種方式的任何一種。
TRUE 的元素將會被選中,
而那些對應 FALSE 的元素則被忽略。例如
> y <- x[!is.na(x)]
這將創建(或重建)一個含 x 中非缺省且次序不變的元素的物件 y。
注意,如果
x 含有缺省值,y 在長度上將會比 x 短。
同樣
> (x+1)[(!is.na(x)) & x>0] -> z
將創建一個物件 z 並且把向量
x+1 的值賦給它,其中要求 x 中對應的元素
既非缺省又是正值。
length(x)}的子向量。索引向量中索引對應的元素將會被選中,
並且在結果向量中的次序和索引向量中的次序一致。
這種索引向量可以是任意長度的,結果向量的長度
和索引向量完全一致。如 x[6]表示
x 的第六個元素,此外
> x[1:10]
選擇 x 的前10個元素 (我們假定 length(x) 長度
小於 10)。同樣(看上去好像不可能的事情)
> c("x","y")[rep(c(1,2,2,1), times=4)]
會產生一個長度為
16,由 "x", "y", "y", "x" 重複4次而構成的向量。
> y <- x[-(1:5)]
將 x 除開始五個元素外的其他元素都賦給 y。
names 屬性來識別他的元素。
這種情況下,名字向量的子向量可以像上面第二條提到的
正整數標籤一樣使用。
> fruit <- c(5, 10, 1, 20)
> names(fruit) <- c("orange", "banana", "apple", "peach")
> lunch <- fruit[c("apple","orange")]
名字索引(name indices)相比數值索引(numeric indices) 的好處就是容易記。該用法在後面的資料框(data frames)操作中, 優勢最為明顯。
索引運算式同樣可以出現在賦值操作的接受端。
在這種情況下,賦值操作
僅僅發生在這些索引指定的向量元素中。運算式
必須以 vector[index_vector] 的形式出現,
其中向量名字可以用任何運算式代替。
被賦值的向量必須吻合索引向量的長度, 特別在邏輯向量中它的長度 必須和被建索引的向量長度一致。
例如
> x[is.na(x)] <- 0
將會用0替換 x 中所有的缺省值,而
> y[y < 0] <- -y[y < 0]
和下麵式子等價。
> y <- abs(y)