在R中,我有一个元素x
和一个向量v
。我想找到v
中元素的第一个索引,它等于x
。我知道这样做的一种方法是:which(x == v)[[1]]
,但这似乎效率过低。有更直接的方法吗?
对于奖励积分,如果x
是向量,是否有一个有效的函数?也就是说,它应该返回一个索引向量,指示x
中v
的每个元素的位置。
答案 0 :(得分:379)
函数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
。
答案 1 :(得分:22)
funprog {base}中的函数Position
也可以完成这项工作。它允许您传递任意函数,并返回第一个或最后一个匹配。
Position(f, x, right = FALSE, nomatch = NA_integer)
答案 2 :(得分: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
所以,最好的是
which("Feb" == month.abb)[[1]]
答案 3 :(得分:3)
是的,我们可以按如下方式找到向量中元素的索引:
+
这是在向量中查找元素索引的最有效方法之一。
答案 4 :(得分:-3)
R使用在向量haystack中查找指针索引的方法重载了双等于==
运算符。它会生成一个logical
向量,其中包含大海捞针中每个匹配的TRUE
值。
示例:
haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3 5
haystack[indices]
[1] 4 4
如果两者都是向量,则可以工作,并且可以扩展为使用多个向量。