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

Is there an R function for finding the index of an element in a vector?

提问人:Ryan C. Thompson 提问时间:4/7/2011 最后编辑:Joris MeysRyan C. Thompson 更新时间:4/19/2021 访问量:788390

问:

在 R 中,我有一个元素和一个向量。我想找到元素的第一个索引,该索引等于 .我知道一种方法是:,但这似乎效率太低了。有没有更直接的方法可以做到这一点?xvvxwhich(x == v)[[1]]

对于奖励积分,如果是向量,是否有有效的函数?也就是说,它应该返回一个索引向量,指示 in 中每个元素的位置。xxv

R 索引匹配 矢量化

评论

2赞 BurninLeo 10/12/2015
由于 R 经过优化以处理向量,因此效率并不低。它是一个应用于所有向量元素的比较 () 运算符和索引 () 上的一个子集。就是这样。没有什么应该相关的,只要你没有在这个函数上运行 10.000 次重复。其他解决方案(如 和 可能不会返回 )那么多的数据,但它们不一定更有效。which(x == v)[[1]]==whichmatchPositionwhich
6赞 Ryan C. Thompson 10/12/2015
我的问题指定我更喜欢矢量化而不是 x 的函数,而不是。which(x == v)[[1]]
0赞 berriz44 8/22/2023
新问题占位符:

答:

587赞 Joris Meys 4/7/2011 #1

该函数适用于向量: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%返回一个逻辑向量,只要第一个参数,如果可以在第二个参数中找到该值,则返回其他参数。TRUEFALSE

评论

1赞 John 4/7/2011
我认为 c(2,3,3) 和 c(1,2,3,4) 同时具有匹配和 %in% 的示例会更有启发性,示例之间的变化更少。match(c(2,3,3), c(1:4)) 返回不同的结果,其中 which(c(2,3,3) %in% c(1:4)) 不需要更长的第一个向量,也不需要从示例到示例进行尽可能多的更改。还值得注意的是,他们处理非匹配项的方式非常不同。
1赞 Joris Meys 4/7/2011
@John:这都是真的,但这不是OP要求的。OP 要求从长向量开始,找到另一个向量中给出的第一个元素匹配项。为了完整起见,我补充说,如果你对所有指数都感兴趣,你必须使用 which(%in%)。顺便说一句,没有理由删除您的答案。这是有效的信息。
3赞 apitsch 6/11/2017
我认为,如果您想要第一次出现的索引,那么强调论点的顺序会很有帮助。对于您的示例,给出不同的结果,起初并不是很明显。matchmatch(x,c(4,8))
0赞 Joris Meys 6/11/2017
@goldenoslik 如果您阅读 的帮助页面会有所帮助。这一切都在那里解释。但我添加了那条信息。match
33赞 pedroteixeira 2/11/2013 #2

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

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

19赞 Andrii 5/18/2018 #3

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

 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]]

评论

2赞 markus 11/21/2019
您的基准测试基于长度为 12 的向量,因此没有意义。同样在您的示例中返回 –为什么 ?which("Feb" == month.abb)2[[1]]
1赞 Andrii 11/22/2019
@markus此代码 which(“Feb” == month.abb)[[1]] 返回 “2”,此代码 which(month.abb %in% “Feb”) 也返回 “2”。另外,不清楚为什么使用向量没有意义
4赞 markus 11/22/2019
这不是关于向量,而是关于它的长度。您应该生成一个适当长度的向量,然后基于该向量进行基准测试。引用 OP 的问题“我知道一种方法是:但这似乎效率太低了。which(x == v)[[1]]
15赞 CinnamonCubing 4/12/2021 #4

是的,我们可以在向量中找到元素的索引,如下所示:

> a <- c(3, 2, -7, -3, 5, 2)
> b <- (a==-7)  # this will output a TRUE/FALSE vector
> c <- which(a==-7) # this will give you numerical value
> a
[1]  3  2 -7 -3  5  2
> b
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
> c
[1] 3

这是在向量中查找元素索引的最有效方法之一。