编辑:正则表达式的方式是:
match.regex <- function(x,data){
xs <- paste(x,collapse="_")
dats <- apply(data,1,paste,collapse="_")
sum(grepl(xs,dats))
}
> match.regex(c(1),dat)
[1] 3
> match.regex(c(0,0,0),dat)
[1] 1
> match.regex(c(1,2),dat)
[1] 2
> match.regex(5,dat)
[1] 0
令人惊讶的是,这个方法比这里给出的其他方法快,并且是我下面的解决方案的两倍,无论是在小型数据集还是大型数据集上。正则表达式显然得到了优化:
> benchmark(matching(c(1,2),dat),match.regex(c(1,2),dat),replications=1000)
test replications elapsed relative
2 match.regex(c(1, 2), dat) 1000 0.15 1.0
1 matching(c(1, 2), dat) 1000 0.36 2.4
一种可以立即为您提供数字并更加矢量化的方法如下:
matching.row <- function(x,row){
nx <- length(x)
sid <- which(x[1]==row)
any(sapply(sid,function(i) all(row[seq(i,i+nx-1)]==x)))
}
matching <- function(x,data)
sum(apply(data,1,function(i) matching.row(x,i)),na.rm=TRUE)
在这里,您首先创建一个带有索引的矩阵,该索引将窗口移动到与您要匹配的向量长度相同的行上。然后对照向量检查这些窗口。每一行都遵循这种方法,返回 TRUE 的行的总和就是你想要的。
> matching(c(1),dat)
[1] 3
> matching(c(0,0,0),dat)
[1] 1
> matching(c(1,2),dat)
[1] 2
> matching(5,dat)
[1] 0