[R] A category reduction problem

Kathy Gerber kmg5b at virginia.edu
Fri Mar 20 16:06:41 CET 2009


I am trying to print out a list of strings of length 11 based on 
integers 0 through 10.  The rules as given to me for the ordering are:
The first digit must be 0.
The 2nd digit must be 0 or 1.
The 3rd digit must equal the 2nd digit or the 2nd digit +1.
...
Given the final digit, n, all digits 0 through n must appear in a given 
sequence.

So the final 1024 item list should look like 

0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 9
0 1 2 3 4 5 6 7 8 8 9
0 1 2 3 4 5 6 7 7 8 9
...
0 1 2 3 4 5 6 7 8 8 8
0 1 2 3 4 5 6 7 7 8 8
...
0 1 2 3 3 3 3 3 3 3 3
0 1 2 2 3 3 3 3 3 3 3
...
0 0 0 0 0 0 0 0 0 0 0

This is easy to do for a small integer, e.g., to see what's going on I 
drew the tree for 5, getting 16 rows including the two trivial rows, 0 0 
0 0 0 and 0 1 2 3 4.  Offsetting from 0-10 to 1-11, I have tried two 
basic approaches with only partial success:  using nested loops (gets 
messy quickly), and using the partitions package to construct rows by 
generating combinations based on the partitions.

Here's my very flawed code for completeness, but I'm guessing there is a 
better approach entirely.  There are actually 56 partitions (here 
hardcoded 2:19). 

require(partitions)
b <- as.matrix(parts(11))
u <- b[-1,]
for (ptn in 2:19) {
s <- as.matrix(u[, ptn])
dss <- as.vector(s[which(s>0)])
if (length(dss) <= b[1, ptn]) {
  comb <- combn(b[1, ptn], length(dss))
  ccnt <- dim(comb)[2]
  for (i in ccnt:1) {
  a <- c(1:b[1,ptn])
  for (k in 1:length(dss)) {
    a <- c(a,rep(comb[k, i], u[k, ptn]))
  }
   cat(sort(a-1,"\n")
  }
 }
}

I appreciate any insight or direction.

"Counting is hard."  -- Alan Lee Schwartz
-----------------------------------------------------
Kathy Gerber
University of Virginia
Research Computing Lab




More information about the R-help mailing list