378

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

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

4

4 回答 4

535

该函数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如果该值可以在第二个参数中找到,则返回 aFALSE否则。

于 2011-04-07T08:00:45.570 回答
28

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

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

于 2013-02-11T14:30:27.347 回答
14

A small note about the efficiency of abovementioned methods:

 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

So, the best one is

    which("Feb" == month.abb)[[1]]
于 2018-05-17T18:23:27.603 回答
6

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

> 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

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

于 2021-04-11T20:05:48.223 回答