[R] yet another vectorization question

From: Adrian DUSA <adi_at_roda.ro>
Date: Mon 30 Jan 2006 - 22:34:40 EST


Dear R-helpers,

I'm trying to develop a function which specifies all possible expressions that can be formed using a certain number of variables. For example, with three variables A, B and C we can have

- presence/absence of A; B and C
- presence/absence of combinations of two of them
- presence/absence of all three

    A B C
1 0
2 1

3       0
4       1
5           0
6           1

7 0 0
8 0 1
9 1 0
10 1 1
11  0       0
12  0       1
13  1       0
14  1       1
15      0   0
16      0   1
17      1   0
18      1   1

19 0 0 0
20 0 0 1
21 0 1 0
22 0 1 1
23 1 0 0
24 1 0 1
25 1 1 0
26 1 1 1

My function (pasted below) while producing the desired result, still needs some more vectorizing; in particular, I can't figure out how could one modify the element of a matrix using apply on a different matrix... To produce the above outcome, I use:
> all.expr(LETTERS[1:3])

"all.expr" <-
function(column.names) {

    ncolumns <- length(column.names)
    return.matrix <- matrix(NA, nrow=(3^ncolumns - 1), ncol=ncolumns)     colnames(return.matrix) <- column.names     rownames(return.matrix) <- 1:nrow(return.matrix)     start.row <- 1
    all.combn <- sapply(1:ncolumns, function(idx) {

                                        as.matrix(combn(ncolumns, idx))
                                    }, simplify=FALSE)
    for (j in 1:length(all.combn)) {
        idk <- all.combn[[j]]
        tt <- matrix(NA, ncol=nrow(idk), nrow=2^nrow(idk))
        for (i in 1:nrow(idk)) {
            tt[,i] <- c(rep(0, 2^(nrow(idk) - i)), rep(1, 2^(nrow(idk) - i)))
        }

        ## This is _slow_ part, where I don't know how to vectorize:
        for (k in 1:ncol(idk)) {
            end.row <- start.row + nrow(tt) - 1
            return.matrix[start.row:end.row, idk[ , k]] <- tt
            start.row <- end.row + 1
        }
        ## How can one modify "return.matrix" using apply on "idk"?
    }
        return.matrix[is.na(return.matrix)] <- ""
        return.matrix

    }
}

Thank you in advance,
Adrian

-- 
Adrian DUSA
Romanian Social Data Archive
1, Schitu Magureanu Bd
050025 Bucharest sector 5
Romania
Tel./Fax: +40 21 3126618 \
          +40 21 3120210 / int.101

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Received on Mon Jan 30 22:48:13 2006

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:42:14 EST