Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在较大的向量中匹配序列_R - Fatal编程技术网

R 在较大的向量中匹配序列

R 在较大的向量中匹配序列,r,R,我想要一个函数,它返回向量的匹配子序列的初始标记。例如: y <- c("a","a","a","b","c") multi_match(c("a","a"), y) # [1] 1 2 multi_match(c("a","b"), y) # [1] 3 y在动物园中尝试rollapply: library(zoo) which(rollapply(y, 2, identical, c("a", "a"))) ## [1] 1 2 which(rollapply(y, 2, ide

我想要一个函数,它返回向量的匹配子序列的初始标记。例如:

y <- c("a","a","a","b","c")

multi_match(c("a","a"), y)
# [1] 1 2

multi_match(c("a","b"), y)
# [1] 3

y在动物园中尝试
rollapply

library(zoo)
which(rollapply(y, 2, identical, c("a", "a")))
## [1] 1 2
which(rollapply(y, 2, identical, c("a", "b")))
## [1] 3

BioConductor软件包
BioStrings
中有很多字符串匹配功能,尽管这适用于“字符串”,即“长度为1”的字符向量,而不是您拥有的向量。
library(zoo)
which(rollapply(y, 2, identical, c("a", "a")))
## [1] 1 2
which(rollapply(y, 2, identical, c("a", "b")))
## [1] 3
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