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

发布于 2024-10-31 08:37:50 字数 289 浏览 1 评论 0原文

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

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

In R, I have an element x and a vector v. I want to find the first index of an element in v that is equal to x. I know that one way to do this is: which(x == v)[[1]], but that seems excessively inefficient. Is there a more direct way to do it?

For bonus points, is there a function that works if x is a vector? That is, it should return a vector of indices indicating the position of each element of x in v.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

金兰素衣 2024-11-07 08:37:50

函数 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

The function match works on vectors:

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 only returns the first encounter of a match, as you requested. It returns the position in the second argument of the values in the first argument.

For multiple matching, %in% is the way to go:

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% returns a logical vector as long as the first argument, with a TRUE if that value can be found in the second argument and a FALSE otherwise.

伤痕我心 2024-11-07 08:37:50

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

位置(f, x, right = FALSE, nomatch = NA_integer)

the function Position in funprog {base} also does the job. It allows you to pass an arbitrary function, and returns the first or last match.

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

温折酒 2024-11-07 08:37:50

关于上述方法效率的一个小注释:

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

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]]
萌能量女王 2024-11-07 08:37:50

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

> 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

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

Yes, we can find the index of an element in a vector as follows:

> 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

This is one of the most efficient methods of finding the index of an element in a vector.

晒暮凉 2024-11-07 08:37:50
library(vctrs)

vec_match(c("a", "y"), letters)
# [1]  1 25

vec_match() 的工作方式与基本 R match() 类似,但有一个明显的区别。它可以更好地控制 NA 匹配:

library(vctrs)

match(NA, c(NA, 1:2))
# [1] 1

vec_match(NA, c(NA, 1:2))
# [1] 1

vec_match(NA, c(NA, 1:2), na_equal = FALSE)
# [1] NA
library(vctrs)

vec_match(c("a", "y"), letters)
# [1]  1 25

vec_match() works like base R match() with one noticeable difference. It gives more control over NA matching:

library(vctrs)

match(NA, c(NA, 1:2))
# [1] 1

vec_match(NA, c(NA, 1:2))
# [1] 1

vec_match(NA, c(NA, 1:2), na_equal = FALSE)
# [1] NA
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文