[R] Comparing matrices in R - matrixB %in% matrixA
Charles Novaes de Santana
charles.santana at gmail.com
Fri Oct 31 15:29:53 CET 2014
Thank you, Jeff, for your message.
I did a search, but maybe my problem was that I didn't know the correct way
to search my problem (in other words: my vocabulary in R/English is not
good). Because of this I choose to send a message to the list the most
detailed as possible, and with a first solution, that was not the optimum
one.
Thank you very much for taking your time to think about my problem and to
search for a good solution! I much appreciate it! But I think John'
suggestion does what I need and it is much simpler :)
Best,
Charles
P.S.: the HTML issue is probably because I am using a webmail-client and I
did a copy and paste from the first email I sent.
On Fri, Oct 31, 2014 at 3:15 PM, Jeff Newmiller <jdnewmil em dcn.davis.ca.us>
wrote:
> Thank you for the reproducible example, but posting in HTML can corrupt
> your example code so please learn to set your email client mail format
> appropriately when posting to this list.
>
> I think this [1] post, found with a quick Google search for "R match
> matrix", fits your situation perfectly.
>
> match(data.frame(t(B)), data.frame(t(A)))
>
> Note that concatenating vectors in loops is bad news... a basic
> optimization for your code would be to preallocate a logical result vector
> and fill in each element with a TRUE/FALSE in the outer loop, and use the
> which() function on that completed vector to identify the index numbers (if
> you really need that). For example:
>
> lresult <- rep( NA, nrow(A) )
> for ( ia in seq.int( nrow( A ) ) ) {
> lres <- FALSE
> ib <- 0
> while ( ib < nrow( B ) & !lres ) {
> ib <- ib + 1
> lres <- all( A[ ia, ] == B[ ib, ] )
> }
> lresult[ ia ] <- lres
> }
> result <- which( lresult )
>
> [1]
> http://stackoverflow.com/questions/12697122/in-r-match-function-for-rows-or-columns-of-matrix
> ---------------------------------------------------------------------------
> Jeff Newmiller The ..... ..... Go Live...
> DCN:<jdnewmil em dcn.davis.ca.us> Basics: ##.#. ##.#. Live
> Go...
> Live: OO#.. Dead: OO#.. Playing
> Research Engineer (Solar/Batteries O.O#. #.O#. with
> /Software/Embedded Controllers) .OO#. .OO#. rocks...1k
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
>
> On October 31, 2014 6:20:38 AM PDT, Charles Novaes de Santana <
> charles.santana em gmail.com> wrote:
> >My apologies, because I sent the message before finishing it. i am very
> >sorry about this. Please find below my message (I use to write the
> >messages
> >from the end to the beginning... sorry :)).
> >
> >Dear all,
> >
> >I am trying to compare two matrices, in order to find in which rows of
> >a
> >matrix A I can find the same values as in matrix B. I am trying to do
> >it
> >for matrices with around 2500 elements, but please find below a toy
> >example:
> >
> >A = matrix(1:10,nrow=5)
> >B = A[-c(1,2,3),];
> >
> >So
> >> A
> > [,1] [,2]
> >[1,] 1 6
> >[2,] 2 7
> >[3,] 3 8
> >[4,] 4 9
> >[5,] 5 10
> >
> >and
> >> B
> > [,1] [,2]
> >[1,] 4 9
> >[2,] 5 10
> >
> >I would like to compare A and B in order to find in which rows of A I
> >can
> >find the rows of B. Something similar to %in% with one dimensional
> >arrays.
> >In the example above, the answer should be 4 and 5.
> >
> >I did a function to do it (see it below), it gives me the correct
> >answer
> >for this toy example, but the excess of for-loops makes it extremely
> >slow
> >for larger matrices. I was wondering if there is a better way to do
> >this
> >kind of comparison. Any idea? Sorry if it is a stupid question.
> >
> >matbinmata<-function(B,A){
> > res<-c();
> > rowsB = length(B[,1]);
> > rowsA = length(A[,1]);
> > colsB = length(B[1,]);
> > colsA = length(A[1,]);
> > for (i in 1:rowsB){
> > for (j in 1:colsB){
> > for (k in 1:rowsA){
> > for (l in 1:colsA){
> > if(A[k,l]==B[i,j]){res<-c(res,k);}
> > }
> > }
> > }
> > }
> > return(unique(sort(res)));
> >}
> >
> >
> >Best,
> >
> >Charles
> >
> >On Fri, Oct 31, 2014 at 2:12 PM, Charles Novaes de Santana <
> >charles.santana em gmail.com> wrote:
> >
> >> A = matrix(1:10,nrow=5)
> >> B = A[-c(1,2,3),];
> >>
> >> So
> >> > A
> >> [,1] [,2]
> >> [1,] 1 6
> >> [2,] 2 7
> >> [3,] 3 8
> >> [4,] 4 9
> >> [5,] 5 10
> >>
> >> and
> >> > B
> >> [,1] [,2]
> >> [1,] 4 9
> >> [2,] 5 10
> >>
> >> I would like to compare A and B in order to find in which rows of A I
> >can
> >> find the rows of B. Something similar to %in% with one dimensional
> >arrays.
> >> In the example above, the answer should be 4 and 5.
> >>
> >> I did a function to do it (see it below), it gives me the correct
> >answer
> >> for this toy example, but the excess of for-loops makes it extremely
> >slow
> >> for larger matrices. I was wondering if there is a better way to do
> >this
> >> kind of comparison. Any idea? Sorry if it is a stupid question.
> >>
> >> matbinmata<-function(B,A){
> >> res<-c();
> >> rowsB = length(B[,1]);
> >> rowsA = length(A[,1]);
> >> colsB = length(B[1,]);
> >> colsA = length(A[1,]);
> >> for (i in 1:rowsB){
> >> for (j in 1:colsB){
> >> for (k in 1:rowsA){
> >> for (l in 1:colsA){
> >> if(A[k,l]==B[i,j]){res<-c(res,k);}
> >> }
> >> }
> >> }
> >> }
> >> return(unique(sort(res)));
> >> }
> >>
> >>
> >> Best,
> >>
> >> Charles
> >>
> >>
> >> --
> >> Um axé! :)
> >>
> >> --
> >> Charles Novaes de Santana, PhD
> >> http://www.imedea.uib-csic.es/~charles
> >>
> >
> >
> >
> >--
> >Um axé! :)
> >
> >--
> >Charles Novaes de Santana, PhD
> >http://www.imedea.uib-csic.es/~charles
> >
> > [[alternative HTML version deleted]]
> >
> >______________________________________________
> >R-help em 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.
>
>
--
Um axé! :)
--
Charles Novaes de Santana, PhD
http://www.imedea.uib-csic.es/~charles
[[alternative HTML version deleted]]
More information about the R-help
mailing list