Matching rows?
On Mon, 3 Jul 2000, Bill Venables wrote:
At 01:15 PM 03/07/00 +0200, gb wrote:
I have a matrix X with many rows and a vector y, which I want
to match against the rows of the matrix. I especially want
to know if there is a match or not. I can do this with 'all'
and a 'while' construct:
row.match <- function(y, X)
{
found <- FALSE
j <- 0
while ( (!found) && (j < nrow(X)) )
{
j <- j + 1
found <- all(y == X[j, ])
}
return ( found )
}
Two alternatives:
any( apply(X, 1, all.equal, y) == "TRUE")
any(apply(apply(X, 1, "==", y), 1, all))
Here is a third alternative. It sets out to find which rows match the vector rather than merely if there is a match. It returns a vector of row indices of the matching rows, which is empty if there are no matches, of course:
row.matches <- function(y, X) {
i <- seq(nrow(X)) j <- 0 while(length(i) && (j <- j + 1) < ncol(X)) i <- i[X[i, j] == y[j]] i } Here is a quick checkout
X <- matrix(sample(0:1, 53000*11, rep=T), 53000, 11) y <- X[53000, ] dos.time(row.match(y, X))
[1] 1.48
dos.time(row.matches(y, X))
[1] 0.16003
[...]
Amazing, and smart! "Looping" over a few columns istead of over
many rows does the trick, I guess. I got even bigger differences
on my machine.
One tiny error, though: The "while" statement should read
while(length(i) && (j <- j + 1) <= ncol(X))
^
I think. Thanks! |
G?ran
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._