Here is another approach : rowmatch.count <- function(a,b) { f <- function(...) paste(..., sep=":") a2 <- do.call("f", as.data.frame(a)) b2 <- do.call("f", as.data.frame(b)) c(table(c(a2,unique(b2)))[b2] - 1) }
# example a <- matrix(c(1,2,1,5,2,5), 2, 3) b <- matrix(c(1,2,4,5,7,7,9,2, 5,5, 9,8,8,10,10, 5), 8, 2) rowmatch.count(b, t(a)) Interestingly, this was suggested by either Marc or Gabor about 3 years ago when I had the same question; you may be able to tack it down in r-help archives. Hope this helps, Ravi. ---------------------------------------------------------------------------- ------- Ravi Varadhan, Ph.D. Assistant Professor, The Center on Aging and Health Division of Geriatric Medicine and Gerontology Johns Hopkins University Ph: (410) 502-2619 Fax: (410) 614-9625 Email: rvarad...@jhmi.edu Webpage: http://www.jhsph.edu/agingandhealth/People/Faculty_personal_pages/Varadhan.h tml ---------------------------------------------------------------------------- -------- -----Original Message----- From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On Behalf Of Marc Schwartz Sent: Thursday, July 02, 2009 10:20 AM To: dreamworx Cc: r-help@r-project.org Subject: Re: [R] matching rows in matrices On Jul 2, 2009, at 7:27 AM, dreamworx wrote: > > I have a matrix such as this, > > [,1] [,2] [,3] > [1,] 1 1 2 > [2,] 2 5 5 > > and a larger matrix such as this, > > a b > [1,] 1 5 > [2,] 2 5 > [3,] 4 9 > [4,] 5 8 > [5,] 7 8 > [6,] 7 10 > [7,] 9 10 > > what I want to do is check the number of times the columns in the > first matrix appear as rows in the second matrix. So for instance in > this example > 1,5 and 2,5 appear in both so I'd want R to return the number 2. Is > there a function to do this? My first approach would be to use merge(), which performs a relational join. So, given mat1: # Note the rownames here, to match the colnames in mat2 > mat1 [,1] [,2] a 1 2 b 5 5 and mat2: > mat2 a b [1,] 1 5 [2,] 2 5 [3,] 4 9 [4,] 5 8 [5,] 7 8 [6,] 7 10 [7,] 9 10 Using merge() we get: > merge(t(mat1), mat2) a b 1 1 5 2 2 5 This gives us the rows that match between the two matrices. Note that I transpose mat1 so that the structure matches that of mat2. Then just use nrow() to get a count: > nrow(merge(t(mat1), mat2)) [1] 2 See ?merge for more information. HTH, Marc Schwartz ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.