Skip to content

Vector comparison to matrix

4 messages · Todd Remund, Brian Ripley, Ravi Varadhan

#
I am looking for a fast way to count the number of rows in a matrix are 
identical to a pattern vector.  For example, if I am interested in counting 
the number of row vectors in a matrix that are identical to (1,2,3) what 
would I do?  I have tried the identical statement in a loop but this is far 
too slow.  I have a very large matrix and need to avoid loops at all costs.  
Thanks for any help.
Todd Remund
#
Probably you use the idea from unique.matrix, that is

1) form a string from each row and
2) call match() to see which strings match your pattern row.
On Sun, 14 Aug 2005, Todd Remund wrote:

            

  
    
#
On Mon, 15 Aug 2005, Prof Brian Ripley wrote:

            
If your matrix A really does have short rows like c(1,2,3) and millions of 
them, another idea is to do

target <- rep(c(1,2,3), each= nrow(A))
rowSums(A != target) == 0

For wider rows my first suggestion is probably faster.

  
    
#
Hi Todd,

Here is a function that was suggested to me by Gabor Grothendieck.  This
function counts the number of times each row of a matrix B occurs in another
matrix A.

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)
}

If you are interested in finding the number of occurrences of a vector "b"
instead, you can call this function as follows:

rowmatch.count(A,t(as.matrix(b))

Hope this is helps,
Ravi.