在R语言中,我有一个元素x
和一个向量v
。我想要找到向量v
中第一个等于x
的元素的索引。我知道一种做法是:which(x == v)[[1]]
,但这似乎过于低效。有没有更直接的方法?
如果x
是一个向量,是否有函数可以返回x
中每个元素在v
中的位置索引向量?
在R语言中,我有一个元素x
和一个向量v
。我想要找到向量v
中第一个等于x
的元素的索引。我知道一种做法是:which(x == v)[[1]]
,但这似乎过于低效。有没有更直接的方法?
如果x
是一个向量,是否有函数可以返回x
中每个元素在v
中的位置索引向量?
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
。
match
函数中参数的顺序对于想要获得第一个匹配项的索引非常有帮助。以你的例子为例,match(x,c(4,8))
会得到不同的结果,而这一点一开始可能并不是非常明显。 - apitsch在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]]
? - markuswhich(x == v)[[1]]
,但这似乎非常低效。” - markus是的,我们可以按以下方式在向量中找到元素的索引:
> 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
这是一种在向量中查找元素索引的最有效方法之一。
which(x == v)[[1]]
并不是非常低效的。这是一个比较(==
)运算符应用于所有向量元素和一个索引子集(which
)。就这些。只要您不在此函数上运行10,000次重复,那么这些都不应该是相关的。其他解决方案,如match
和Position
可能不会返回与which
一样多的数据,但它们不一定更有效。 - BurninLeowhich(x == v)[[1]]
不能。请你翻译该句话。 - Ryan C. Thompson