[R] Comparing matrices

Ravi Varadhan rvaradhan at jhmi.edu
Thu Mar 11 15:22:31 CET 2010


Look at:

	identical(pop, pop2)  # if you want to do "exact" comparison

Or

	all.equal(pop, pop2, tolerance=1.e-10)  # if you want to allow for
some small noise

Ravi.

-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of Esmail
Sent: Thursday, March 11, 2010 7:38 AM
To: r-help at r-project.org
Subject: [R] Comparing matrices

Hello all,

I have two matrices, pop and pop2, each the same number of rows and
columns that I want to compare for equality. I am concerned about
efficiency in this operation.

I've tried a few things without success so far. Doing something simple like:

if (pop==pop2) { cat('equal') } else { cat('NOT equal') }

results in the warning:
1: In if (pop == pop2) { :
   the condition has length > 1 and only the first element will be used

so it seems to look only at the first element.

print(pop==pop2) gives me a listing of TRUE/FALSE values for each
element.

I am really only looking for a single TRUE or FALSE value to tell me
if the two populations (ie pop and pop2) are the same or different. In
my application there will be about 200 columns and 50 rows and this
comparison will happen very frequently (possibly a few thousand
times), so I am concerned about efficiency.

I am appending the code I used to generate my matrices and some things
I tried (mentioned above) and also the output get so far.

FWIW, Linux environment, R 2.10.1.

Thanks,
Esmail

ps: Am I correct that if I do the assignment

     pop2 = pop

     I create a totally separate instance/(deep)copy of the
     data? I tried a few tests that seem to confirm this, but I'd
     rather be sure.


------- code ------------

# create a binary vector of size "len"
create_bin_Chromosome <- function(len)
{
   sample(0:1, len, replace=T)
}

# create popsize members, each of length len
create_pop_2 <- function(popsize, len)
{
   datasize=len*popsize

   npop <- matrix(0, popsize, len, byrow=T)

   for(i in 1:popsize)
     npop[i,] = create_bin_Chromosome(len)

   npop
}


POP_SIZE = 3
LEN = 8

pop = create_pop_2(POP_SIZE, LEN)
pop2 = pop

print(pop==pop2)
if (pop==pop2) { cat('equal\n') } else { cat('NOT equal\n') }

print(pop)
print(pop2)

pop[2,5] = 99
pop2[3,3] = 77

print(pop==pop2)
if (pop==pop2) { cat('equal\n') } else { cat('NOT equal\n') }

print(pop)
print(pop2)

------ output -----------

 > source('popc.R')
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
equal
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    1    0    1    1    0
[2,]    0    1    1    0    0    0    0    0
[3,]    0    1    0    0    1    0    1    1
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    1    0    1    1    0
[2,]    0    1    1    0    0    0    0    0
[3,]    0    1    0    0    1    0    1    1
      [,1] [,2]  [,3] [,4]  [,5] [,6] [,7] [,8]
[1,] TRUE TRUE  TRUE TRUE  TRUE TRUE TRUE TRUE
[2,] TRUE TRUE  TRUE TRUE FALSE TRUE TRUE TRUE
[3,] TRUE TRUE FALSE TRUE  TRUE TRUE TRUE TRUE
equal
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    1    0    1    1    0
[2,]    0    1    1    0   99    0    0    0
[3,]    0    1    0    0    1    0    1    1
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    1    0    1    1    0
[2,]    0    1    1    0    0    0    0    0
[3,]    0    1   77    0    1    0    1    1
Warning messages:
1: In if (pop == pop2) { :
   the condition has length > 1 and only the first element will be used
2: In if (pop == pop2) { :
   the condition has length > 1 and only the first element will be used
 >

______________________________________________
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.



More information about the R-help mailing list