# [R] yet another vectorization question

Mon Jan 30 12:57:16 CET 2006

```this looks similar:
do.call(expand.grid,split(t(replicate(3,c(0,1,NA))),1:3))

>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
>    }
>}
>