# [R] yet another vectorization question

Philippe Grosjean phgrosjean at sciviews.org
Mon Jan 30 13:40:34 CET 2006

```Hello,

Not exactly the same. By the way, why do you use do.call()? Couldn't you
do simply:

expand.grid(split(t(replicate(3, c(0, 1, NA))), 1:3))

Best,

Philippe Grosjean

Jacques VESLOT wrote:
> this looks similar:
> do.call(expand.grid,split(t(replicate(3,c(0,1,NA))),1:3))
>
>
> Adrian DUSA a écrit :
>
>
>>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
>>   }
>>}
>>
>>
>>
>>
>
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help