Next: , Previous: Character vectors, Up: Simple manipulations numbers and vectors



2.7 索引向量;選擇和修改一個資料集的子集

一個向量的子集(subset)元素可以通過向量名後面的方括號中 加入 索引向量 得到。如果一個運算式的結果是向量,則 我們可以直接在運算式的 末尾方括號中加入索引向量以 得到結果向量的子向量(如果有的話)。

這種索引向量可以採用下面四種方式的任何一種。

  1. 邏輯向量。這種情況下,索引向量必須 和被挑選元素的向量長度一致。 向量中對應索引向量為 TRUE 的元素將會被選中, 而那些對應 FALSE 的元素則被忽略。例如
              > y <- x[!is.na(x)]
         

    這將創建(或重建)一個含 x 中非缺省且次序不變的元素的物件 y。 注意,如果 x 含有缺省值,y 在長度上將會比 x 短。 同樣

              > (x+1)[(!is.na(x)) & x>0] -> z
         

    將創建一個物件 z 並且把向量 x+1 的值賦給它,其中要求 x 中對應的元素 既非缺省又是正值。

  2. 正整數向量。這種情況下, 索引向量必須是 {1, 2, ..., 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次而構成的向量。

  3. 負整數向量。這種索引向量 指定被排除的元素而不是包括進來1。因此
              > y <- x[-(1:5)]
         

    x 除開始五個元素外的其他元素都賦給 y

  4. 字串向量。這可能僅僅用於 一個物件可以用 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)

Footnotes

[1] 譯者注:索引向量中,不可以同時出現正整數和負整數