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 的位置。和所有 R 向量索引一样,这些位置从 1 开始。
%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)。返回的位置对应被搜索向量,因此将它们用于相关数据时,要留意该向量的顺序。
示例中的代码及显示内容(包括标签)保留为英文。