# [R] comparing two matrices

Sun Jan 21 10:53:04 CET 2007

```Hello Marc and Dimitris,

There was an error in my first example (therefore not reproducible), so
mat1 <- expand.grid(0:2, 0:2, 0:2)
mat2 <- mat1[c(19, 16, 13, 24, 8), ]

Your solution works if and only if the elements in both matrices are unique.
Unfortunately, it does not apply for my matrices where elements do repeat
(only the rows are unique).

> which(apply(matrix(mat1 %in% mat2, dim(mat1)), 1, all))
integer(0)

> which((mat1 %in% mat2)[1:nrow(mat1)])
integer(0)

Another solution would be using base 3 operations:
mat1 <- expand.grid(0:2, 0:2, 0:2)[, 3:1]
mat2 <- mat1[c(19, 16, 13, 24, 8), ]

mylines <- mat2[, 1]
for (i in 2:ncol(mat2)) {mylines <- 3*mylines + mat2[, i]}
mylines + 1
 19 16 13 24  8

I was still hoping for a direct matrix function to avoid the for() loop.
Thanks,

On Sunday 21 January 2007 01:06, Marc Schwartz wrote:
> On Sun, 2007-01-21 at 00:14 +0200, Adrian Dusa wrote:
> > Dear helpeRs,
> >
> > I have two matrices:
> > mat1 <- expand.grid(0:2, 0:2, 0:2)
> > mat2 <- aa[c(19, 16, 13, 24, 8), ]
> >
> > where mat2 is always a subset of mat1
> >
> > I need to find the corersponding row numbers in mat1 for each row in
> > mat2. For this I have the following code:
> >
> > apply(mat2, 1, function(x) {
> >     which(apply(mat1, 1, function(y) {
> >         sum(x == y)
> >         }) == ncol(mat1))
> >     })
> >
> > The code is vectorized, but I wonder if there is a simpler (hence faster)
> > matrix computation that I miss.
> >
> > Thank you,
>
> I have not fully tested this, but how about:
>
> mat1 <- matrix(1:20, ncol = 4, byrow = TRUE)
> mat2 <- matrix(1:60, ncol = 4, byrow = TRUE)
> mat2 <- mat2[sample(15), ]
>
> > mat1
>
>      [,1] [,2] [,3] [,4]
> [1,]    1    2    3    4
> [2,]    5    6    7    8
> [3,]    9   10   11   12
> [4,]   13   14   15   16
> [5,]   17   18   19   20
>
> > mat2
>
>       [,1] [,2] [,3] [,4]
>  [1,]   13   14   15   16
>  [2,]    5    6    7    8
>  [3,]   41   42   43   44
>  [4,]   17   18   19   20
>  [5,]   21   22   23   24
>  [6,]   25   26   27   28
>  [7,]   53   54   55   56
>  [8,]    9   10   11   12
>  [9,]   57   58   59   60
> [10,]   33   34   35   36
> [11,]   49   50   51   52
> [12,]   45   46   47   48
> [13,]    1    2    3    4
> [14,]   29   30   31   32
> [15,]   37   38   39   40
>
> > which(apply(matrix(mat2 %in% mat1, dim(mat2)), 1, all))
>
>   1  2  4  8 13
>
>
> HTH,
>
> Marc Schwartz

--