是否有R函数来查找向量中元素的索引?


324

在R中,我有一个element x和一个vector v。我想找到一个v等于的元素的第一个索引x。我知道执行此操作的一种方法是:which(x == v)[[1]],但这似乎效率太低。有更直接的方法吗?

对于奖励积分,如果x是矢量,是否存在可以使用的功能?也就是说,它应返回索引向量,指示xin 中每个元素的位置v


由于R已针对与向量一起使用进行了优化,which(x == v)[[1]]因此效率不是很高。这是一个==应用于所有矢量元素的比较()运算符,是索引(which)的一个子集。而已。只要您没有在此函数上运行10.000次重复,就没有关系了。其他解决方案,例如matchPosition可能不会返回与一样多的数据which,但是它们不一定更有效。
BurninLeo

2
我的问题指定我更喜欢一个比x向量化的函数,而which(x == v)[[1]]不是。
瑞安·汤普森

Answers:


461

该函数match适用于矢量:

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

match仅根据您的要求返回比赛的第一次遭遇。它返回第一个参数中值在第二个参数中的位置。

对于多个匹配,%in%方法是:

x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1]  2  5  9 10

%in%只要第一个参数返回逻辑向量,TRUE如果在第二个参数中可以找到该值,则返回,FALSE否则返回。


我认为具有c(2,3,3)和c(1,2,3,4)且具有match和%in%的示例将更具指导性,并且示例之间的更改较少。match(c(2,3,3),c(1:4))返回不同的结果,其中which(c(2,3,3)%in%c(1:4))不需要更长的第一个向量,并且as实例之间有很多变化。还值得注意的是,他们对不比赛的处理方式非常不同。
约翰

1
@John:没错,但这不是OP要求的。OP要求从一个长向量开始,查找另一个元素中给定的元素的第一个匹配项。为了完整性,我补充说,如果您对所有索引都感兴趣,则必须使用which(%in%)。顺便说一句,没有理由删除您的答案。这是有效信息。
Joris Meys 2011年

1
我想强调一下,match如果您想要第一次出现的索引,那么论点在事项中的顺序将很有帮助。对于您的示例,match(x,c(4,8))给出不同的结果,起初并不十分明显。
apitsch

@goldenoslik如果您阅读以下内容的帮助页面,将会有所帮助 match。在那里都有解释。但是我添加了那条信息。
Joris Meys

谢谢!这个解决方案拯救了我的一天!
Jinhua Wang

26

Positionfunprog {base}中的功能也可以完成这项工作。它允许您传递任意函数,并返回第一个或最后一个匹配项。

Position(f, x, right = FALSE, nomatch = NA_integer)


10

关于上述方法效率的一点说明:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100

所以,最好的是

    which("Feb" == month.abb)[[1]]

您的基准基于长度12向量,因此没有意义。同样在您的示例中which("Feb" == month.abb)返回– 2为什么[[1]]
markus

@markus此代码which(“ Feb” == month.abb)[[1]]返回“ 2”,并且此代码which(month.abb%in%“ Feb”)也返回“ 2”。同样,不清楚为什么使用向量没有意义
Andrii

1
它与向量无关,而与向量的长度有关。您应生成一个适当长度的向量,然后根据该向量进行基准测试。引用OP的问题:“我知道做到这一点的一种方法是: which(x == v)[[1]]但这似乎效率太低。”
markus

-5

R ==用一种在向量干草堆中查找针的索引的方法使double equals 运算符过载。它产生一个logical向量,其中包含TRUE大海捞针中每个匹配项的值。

例:

haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3  5
haystack[indices]
[1] 4  4

如果两者都是向量,则可以使用,也可以扩展为使用多个向量。


2
==运营商在我作为一个低效率的解决方案,不带针的矢量工作问题已经提到。
瑞安·汤普森

“如果两者都是向量,它就可以工作” –可能取决于您的意思……但并非OP想要的那样。
法兰克(Frank)

30
我得到FALSE FALSE TRUE FALSE TRUE的,而不是在这个例子指数
Sashko Lykhenko

6
您永远不会在R中运行。==返回逻辑向量,而不是索引。为此which(),正如我7年前解释的那样。
Joris Meys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.