[R] how to randomly eliminate half the entries in a vector?

Esmail Bonakdarian esmail.js at gmail.com
Wed Feb 18 04:13:03 CET 2009


(sorry if this is a duplicate-problems with posting at my end)
----
Hello all,

I need some help with a nice R-idiomatic and efficient solution to a
small problem.

Essentially, I am trying to eliminate randomly half of the entries in
a vector that contains index values into some other vectors.

More details:

I am working with two strings/vectors of 0s and 1s. These will contain
about 200 elements (always the same number for both)

I want to:

1. determines the locations of where the two strings differ

    --> easy using xor(s1, s2)

2. *randomly* selects *half* of those positions

    --> not sure how to do this. I suppose the result would be
        a list of index positions of size sum(xor(s1, s2))/2

3. exchange (flip) the bits in those random positions for both strings

    --> I have something that seems to do that, but it doesn't look
        slick and I wonder how efficient it is.

Mostly I need help for #2, but will happily accept suggestions for #3,
or for that matter anything that looks odd.

Below my partial solution .. the HUX function is what I am trying
to finish if someone can point me in the right direction.

Thanks
Esmail
------

rm(list=ls())

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

####################################################
# HUX - half uniform crossover
#
# 1. determines the locations of where the two strings
#    differ (easy xor)
#
# 2. randomly selects half of those positions
#
# 3. exchanges (flips) the bits in those positions for
#    both
#
HUX <- function(b1, b2)
{
   # 1. find differing bits
   r=xor(b1, b2)

   # positions where bits differ
   different = which(r==TRUE)

   cat("\nhrp: ", different, "\n")
   # 2. ??? how to do this best so that each time
   #    a different half subset is selected? I.e.,
   #    sum(r)/2 positions.

   # 3. this flips *all* positions, should really only flip
   #    half of them (randomly selected half)
   new_b1 = b1
   new_b2 = b2

   for(i in different)  # should contain half the entries (randomly)
       {
         new_b1[i] = b2[i]
         new_b2[i] = b1[i]
       }

   result <- matrix(c(new_b1, new_b2), 2, LEN, byrow=T)
   result
}

LEN = 5
b1=create_bin_Chromosome(LEN)
b2=create_bin_Chromosome(LEN)

cat(b1, "\n")
cat(b2, "\n")

idx=HUX(b1, b2)
cat("\n\n")
cat(idx[1,], "\n")
cat(idx[2,], "\n")




More information about the R-help mailing list