在R中,我有一个元素x和一个向量v。我想找到v中等于x的元素的第一个下标。我知道这样做的一种方法是:which(x == v)[[1]],但这似乎太低效了。有更直接的方法吗?
如果x是向量,有没有一个函数成立?也就是说,它应该返回一个指标向量,指示x的每个元素在v中的位置。
在R中,我有一个元素x和一个向量v。我想找到v中等于x的元素的第一个下标。我知道这样做的一种方法是:which(x == v)[[1]],但这似乎太低效了。有更直接的方法吗?
如果x是向量,有没有一个函数成立?也就是说,它应该返回一个指标向量,指示x的每个元素在v中的位置。
当前回答
funprog {base}中的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]]
是的,我们可以用下面的方法找到向量中元素的下标:
> 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
这是查找向量中元素下标的最有效方法之一。
funprog {base}中的Position函数也可以完成这项工作。它允许您传递任意函数,并返回第一个或最后一个匹配项。
位置(f, x, right = FALSE, nomatch = NA_integer)
函数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只返回您所要求的匹配的第一次相遇。它返回第一个参数中的值在第二个参数中的位置。
对于多重匹配,%在%是要走的方式:
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
%中的%返回一个与第一个参数相同的逻辑向量,如果在第二个参数中可以找到该值,则返回TRUE,否则返回FALSE。