# Re: [R] comparing two matrices

Date: Sun 21 Jan 2007 - 09:53:04 GMT

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
```--
Romanian Social Data Archive
1, Schitu Magureanu Bd
050025 Bucharest sector 5
Romania
Tel./Fax: +40 21 3126618 \
+40 21 3120210 / int.101

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help