[R] comparing two matrices

Adrian Dusa dusa.adrian at gmail.com
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
[1] 19 16 13 24  8


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


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,
> > Adrian
>
> 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]  1  2  4  8 13
>
>
> HTH,
>
> Marc Schwartz

-- 
Adrian Dusa
Romanian Social Data Archive
1, Schitu Magureanu Bd
050025 Bucharest sector 5
Romania
Tel./Fax: +40 21 3126618 \
          +40 21 3120210 / int.101



More information about the R-help mailing list