[R] Comparing matrices

Esmail esmail.js at gmail.com
Thu Mar 11 13:37:58 CET 2010


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
 >



More information about the R-help mailing list