編集: 正規表現の方法は次のようになります。
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
驚くべきことに、これはここに記載されている他の方法よりも高速であり、小規模なデータセットでも大規模なデータセットでも、以下のソリューションの約 2 倍の速さです。正規表現はかなり最適化されているようです:
> 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