[R] Matching a vector with a matrix row

Ravi Varadhan rvaradhan at jhmi.edu
Sat Apr 23 03:47:50 CEST 2011


Here is one solution:

rowmatch <- function(A,B) { 
# Rows in A that match the rows in B
    f <- function(...) paste(..., sep=":")
   if(!is.matrix(B)) B <- matrix(B, 1, length(B))
    a <- do.call("f", as.data.frame(A))
    b <- do.call("f", as.data.frame(B))
    match(b, a)
}

A <- matrix(1:1000, 100, 10, byrow=TRUE)
B <- matrix(21:40, 2, 10, byrow=TRUE)
rowmatch(A, B )

b <- 51:60
rowmatch(A, b)

Ravi.
________________________________________
From: r-help-bounces at r-project.org [r-help-bounces at r-project.org] On Behalf Of Luis Felipe Parra [felipe.parra at quantil.com.co]
Sent: Friday, April 22, 2011 8:56 PM
To: Niels Richard Hansen
Cc: r-help
Subject: Re: [R] Matching a vector with a matrix row

Hello Niels, I am trying to find the rows in Matrix which contain all of the
elements in LHS.

Thank you

Felipe Parra

On Fri, Apr 22, 2011 at 10:30 PM, Niels Richard Hansen <
Niels.R.Hansen+lists at math.ku.dk> wrote:

> Joshua and Luis
>
> Neither of you is exactly solving the problem as stated, see
> below. Luis, could you clarify if you want rows that are _equal_
> to a vector or rows with entries _contained_ in a vector?
>
> If
>
> m <- matrix(c("A", "B", "C", "B", "A", "A"), 3, 2)
> LHS <- c("A", "B")
>
> then LHS equals the first row only, while
>
> apply(m, 1, function(x) all(x %in% LHS))
> [1]  TRUE  TRUE FALSE
>
> finds the rows with entries contained in LHS and
>
> which(m %in% LHS)
> [1] 1 2 4 5 6
>
> finds all entries in m that equals an entry in LHS. While
> you can turn the latter into the former, this will have some
> computational costs too. The R-code
>
> apply(m, 1, function(x) all(x == LHS))
> [1]  TRUE FALSE FALSE
>
> finds the rows that are equal to LHS.
>
> - Niels
>
>
> On 22/04/11 00.18, Joshua Wiley wrote:
>
>> Hi Felipe,
>>
>> Since matrices are just a vector with dimensions, you could easily use
>> something like this (which at least on my system, is slightly faster):
>>
>> results<- which(Matrix %in% LHS)
>>
>> I'm not sure this is the fastest technique thought.  It will return a
>> vector of the positions in "Matrix" that match "LHS".  You can easily
>> convert to row numbers if you want since all columns have the same
>> number of rows.
>>
>> HTH,
>>
>> Josh
>>
>> On Thu, Apr 21, 2011 at 8:56 PM, Luis Felipe Parra
>> <felipe.parra at quantil.com.co>  wrote:
>>
>>> Hello I am trying to compare a vector with a Matrix's rows.The vector has
>>> the same length as the number of columns of the matrix, and I would like
>>> to
>>> find the row numbers where the matrix's row us the same as the given
>>> vector.
>>> What I am doing at the moment is using apply as follows:
>>>
>>> apply(Matrix,1,function(x)all(x%in%LHS))
>>>
>>> but this isn't too fast actually. I would like  to know if any body knows
>>> an
>>> efficient (fast) way of doing this? The matrix contains stings (not
>>> numbers).
>>>
>>> Thank you
>>>
>>> Felipe Parra
>>>
>>>        [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at 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.
>>>
>>>
>>
>>
>>
> --
> Niels Richard Hansen                     Web:   www.math.ku.dk/~richard
> Associate Professor                      Email: Niels.R.Hansen at math.ku.dk
> Department of Mathematical Sciences
> nielsrichardhansen at gmail.com
> University of Copenhagen                 Skype: nielsrichardhansen.dk
> Universitetsparken 5                     Phone: +1 510 502 8161
> 2100 Copenhagen Ø
> Denmark
>
>
>
>
>
>
>
>

        [[alternative HTML version deleted]]


More information about the R-help mailing list