Решение Андри прекрасно.Но если у вас большие матрицы, вы можете попробовать что-то еще, основанное на рекурсии.Если вы работаете по столбцам, вы можете сократить время расчета, исключив все, что не совпадает в первой позиции:
fastercheck <- function(x,matrix){
nc <- ncol(matrix)
rec.check <- function(r,i,id){
id[id] <- matrix[id,i] %in% r[i]
if(i<nc & any(id)) rec.check(r,i+1,id) else any(id)
}
apply(x,1,rec.check,1,rep(TRUE,nrow(matrix)))
}
Сравнение:
> set.seed(100)
> x <- matrix(runif(1e6),ncol=10)
> a <- matrix(runif(300),ncol=10)
> a[c(3,7,9,15),] <- x[c(1000,48213,867,20459),]
> system.time(res1 <- a %inm% x)
user system elapsed
31.16 0.14 31.50
> system.time(res2 <- fastercheck(a,x))
user system elapsed
0.37 0.00 0.38
> identical(res1, res2)
[1] TRUE
> which(res2)
[1] 3 7 9 15
РЕДАКТИРОВАТЬ:
Я проверил принятый ответ просто для удовольствия.Работает лучше, чем двойное применение (когда вы избавляетесь от внутреннего цикла), но рекурсия все еще правит!; -)
> system.time(apply(a, 1, paste, collapse="$$") %in%
+ apply(x, 1, paste, collapse="$$"))
user system elapsed
6.40 0.01 6.41