# [R] yet another vectorization question

Mon Jan 30 12:34:40 CET 2006

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

--