我已经看到很多方法来获取数字或在向量中找到值或甚至许多值,例如:
which(a %in% c(2,3))
但问题是不要尊重我的矢量顺序[2 3],我会寻找矢量但不是每个元素都分开。
你有解决方案吗?
由于
答案 0 :(得分:1)
如果向量中的所有值都是单个数字,则可以使用:gregexpr("23",paste0(a,collapse=""))
返回每个c(2,3)序列中2的位置。
答案 1 :(得分:1)
grep("2|3",paste(a,collapse="|"))
我觉得像“|”这样的分隔符对于困惑的情况可能更好
答案 2 :(得分:0)
对于简单的情况,您可以构造一个2行矩阵并将每个列与查询向量进行比较,然后找到每行中为true的列索引。
which(colSums(rbind(a[1:11],a[2:12]) == c(2,3)) == 2)
答案 3 :(得分:0)
set.seed(0)
a <- sample(1:6,12000, TRUE)
b <- 2:4
vecIn <- function(a,b){
which(
Reduce('+', lapply(seq_along(y <- lapply(b, '==', a)), function(x){
y[[x]][x:(length(a) - length(b) +x)]
}
)
) == length(b)
)
}
> vecIn(a,b)
[1] 2 154 986 1037 1046 1257 1266 1750 2375 2677 3184 3206
[13] 3499 3526 3882 4238 4311 4388 4437 4580 4714 4766 4827 5046
[25] 5279 5629 6153 6842 6856 6919 7200 7516 7520 7707 7824 7859
[37] 8140 8191 8687 9208 9281 9313 10022 10320 10617 10720 10958 11179
[49] 11567 11591 11698 11811
library(zoo)
library(rbenchmark)
func1 <- function(a,b){
gregexpr(paste0(b,collapse=""),paste0(a,collapse=""))
}
func2 <- function(a,b){
which(rollapply(a, length(b), identical, b))
}
func3 <- vecIn
一些基准
benchmark(func1(a,b), func2(a,b), func3(a,b))
test replications elapsed relative user.self sys.self user.child
1 func1(a, b) 100 0.673 5.904 0.680 0.000 0
2 func2(a, b) 100 28.808 252.702 28.198 0.672 0
3 func3(a, b) 100 0.114 1.000 0.116 0.000 0
sys.child
1 0
2 0
3 0