[R] yet another vectorization question
Jacques VESLOT
jacques.veslot at cirad.fr
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))
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
> }
>}
>
>Thank you in advance,
>Adrian
>
>
>
More information about the R-help
mailing list