HOWTO · R

查詢 R 向量中元素的索引

本教程演示瞭如何在 R 向量中查詢元素的索引。

本頁內容

需要找出條件成立的所有位置時,使用 which();需要找出每個指定值首次出現的位置時,使用 match()。若找不到指定值,match() 會回傳 NA。R 向量的位置從 1 開始。下方範例使用同一個向量比較兩者的結果。

使用 which() 找出所有符合條件的位置

which() 接受邏輯向量,並回傳其中值為 TRUE 的位置。將向量與單一值比較時,如果該值出現不只一次,就可能得到多個符合結果。若要搜尋多個值,可使用 %in% 建立邏輯向量,再將它傳給 which()。

執行以下範例,找出 20 出現的所有位置,以及值為 10 或 30 的位置:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

x <- c(10, 20, 10, 30, 20)
which(x == 20)
which(x %in% c(10, 30))
[1] 2 5
[1] 1 3 4

第一個結果包含 20 出現的兩個位置;第二個結果則列出值為 10 或 30 的位置。這些位置從 1 開始,和 R 向量索引的慣例相同。範例中的程式碼與顯示輸出(包含其中的標籤)均維持英文原文。

%in% 是運算子,會針對左側向量的每個元素回傳一個邏輯結果;它不是 which() 的引數。你也可以用 x > 15 這類條件進行搜尋:建立或直接傳入這個邏輯運算式給 which(),即可取得符合條件的位置。由於 which() 只回報對應值為 TRUE 的位置,缺失的邏輯值不會出現在結果中。

使用 match() 找出每個值首次符合的位置

使用 match(needles, haystack),可找出 needles 中每個值在 haystack 首次出現的位置。引數順序很重要:先放要搜尋的值,再放被搜尋的向量。被搜尋的向量即使有重複值,也不會因此回傳重複位置;每個指定值最多只有一個結果。若找不到指定值,match() 預設會回傳 NA。

使用上一節的 x 向量,以下運算式會找出 20 和 30 首次出現的位置,並顯示找不到 40:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

x <- c(10, 20, 10, 30, 20)
match(c(20, 30, 40), x)
[1]  2  4 NA

結果依序對應 20、30 和 40:20 首次出現在位置 2,30 出現在位置 4,而 40 不存在,因此結果是 NA。範例中的程式碼與顯示輸出(包含其中的標籤)均維持英文原文。

請依照所需結果選擇函式:which(x == value) 可以回傳所有符合的位置,而 match(value, x) 只會回傳第一個符合位置。搜尋多個指定值時,which(x %in% values) 會回傳它們在被搜尋向量中的位置;match(values, x) 則會為每個指定值回傳一個首次符合的位置,並保留 values 的順序。這兩個函式都不會改變向量。若要用回傳的位置從另一個向量取值,請記得 match() 找不到值時會回傳 NA;如果要略過未找到的值,使用前先以 !is.na(position) 檢查。回傳的位置是相對於被搜尋的向量,因此套用到相關資料時,請留意該向量的順序。