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

Rya*_*son 290 indexing r vectorization match

在R中,我有一个元素x和一个向量v.我想找到一个元素的第一个索引v,它等于x.我知道这样做的一种方法是:which(x == v)[[1]],但这似乎效率过低.有更直接的方法吗?

对于奖励积分,是否有一个功能,如果x是一个矢量?也就是说,它应该返回一个索引向量,指示xin 的每个元素的位置v.

Jor*_*eys 411

该函数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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为如果您想要第一次出现的索引,强调`match` 中参数的顺序很重要会很有帮助。对于您的示例,`match(x,c(4,8))` 给出了不同的结果,这起初并不是很明显。 (2认同)

小智 24

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

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


小智 14

是的,我们可以按如下方式找到向量中元素的索引:

> 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
Run Code Online (Sandbox Code Playgroud)

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


And*_*rii 7

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

 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
Run Code Online (Sandbox Code Playgroud)

所以,最好的是

    which("Feb" == month.abb)[[1]]
Run Code Online (Sandbox Code Playgroud)

  • 您的基准基于长度为 12 的向量,因此没有意义。同样在您的示例中 `which("Feb" == Month.abb)` 返回 `2` - 为什么是 `[[1]]` ? (2认同)
  • 它与向量无关,而是与向量的长度有关。您应该生成适当长度的向量,然后基于该向量进行基准测试。引用OP问题_“我知道做到这一点的一种方法是:_ `which(x == v)[[1]]`,_但这似乎效率太低了。”_ (2认同)