在 R 中,我有一个元素 x
和一个向量 v
。我想在 v
中找到等于 x
的元素的第一个索引。我知道这样做的一种方法是:which(x == v)[[1]]
,但这似乎效率极低。有没有更直接的方法呢?
对于奖励积分,如果 x
是向量,是否有有效的函数?也就是说,它应该返回一个索引向量,指示 x
的每个元素在 v
中的位置。
which(x == v)[[1]]
的效率并不是那么低。它是一个应用于所有向量元素的比较 (==
) 运算符和一个索引 (which
) 的子集。而已。只要您没有在此功能上运行 10.000 次重复,就没有什么相关的。 match
和 Position
等其他解决方案返回的数据可能不如 which
多,但它们不一定更有效。
which(x == v)[[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%
返回与第一个参数一样长的逻辑向量,如果可以在第二个参数中找到该值,则返回 TRUE
,否则返回 FALSE
。
funprog {base} 中的函数 Position
也可以完成这项工作。它允许您传递任意函数,并返回第一个或最后一个匹配项。
Position(f, x, right = FALSE, nomatch = NA_integer)
关于上述方法的效率的一个小说明:
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]]
which("Feb" == month.abb)
返回 2
- 为什么是 [[1]]
?
which(x == v)[[1]]
,但这似乎效率极低。”
是的,我们可以在向量中找到元素的索引,如下所示:
> 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
这是在向量中查找元素索引的最有效方法之一。
不定期副业成功案例分享
match
中参数的顺序很重要。对于您的示例,match(x,c(4,8))
给出了不同的结果,起初这并不是很明显。match
的帮助页面,它会有所帮助。这一切都在那里解释。但我添加了那条信息。