[R] Choices from a matrix
davidr@rhotrading.com
davidr at rhotrading.com
Fri May 6 22:11:15 CEST 2005
Thanks, Bert, but when I tried that, I didn't get a matrix:
> newX
[[1]]
[1] 1 2 1 2
[[2]]
[1] 5 5 6 6
[[3]]
[1] 1 2 1 2
[[4]]
[1] 5 5 6 6
[[5]]
[1] 0
[[6]]
[1] 0
[[7]]
[1] 0
[[8]]
[1] 0
[[9]]
[1] 1 2 1 2
[[10]]
[1] 5 5 6 6
[[11]]
[1] 1 2 1 2
[[12]]
[1] 5 5 6 6
[[13]]
[1] 0
[[14]]
[1] 0
[[15]]
[1] 0
[[16]]
[1] 0
The matrix is in there, four times in fact. For larger problems, I believe it would be in 2^k times? It is certainly a one-liner, though, so if the matrix could be extracted simply, it could be of use.
Best regards,
David
-----Original Message-----
From: Berton Gunter [mailto:gunter.berton at gene.com]
Sent: Friday, May 06, 2005 2:49 PM
To: David Reiner <davidr at rhotrading.com>; r-help at stat.math.ethz.ch
Subject: RE: [R] Choices from a matrix
If I understand you correctly, here's one way based on expand.grid().
I is just an index set, and so all you really need to do is generate your
2^k rows from the part of the matrix you're using in the right places via
replacement:
e.g. newX<-matrix(0, ncol=ncol(X),nrow=2^length(I))
newX[,I]<-expand.grid(as.list(as.data.frame(X[,I])))
N.B. I tried to do the this without the explicit as.list() cast, but got an
error message. I would have thought that expand.grid should have recognized
that a data.frame IS a list without the cast.
-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
"The business of the statistician is to catalyze the scientific learning
process." - George E. P. Box
> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of
> davidr at rhotrading.com
> Sent: Friday, May 06, 2005 12:06 PM
> To: r-help at stat.math.ethz.ch
> Subject: [R] Choices from a matrix
>
> Could someone please suggest a more clever solution to the
> following problem than my loop below?
>
> Given X a 2xN matrix X, and I a k-subset of N,
> Generate the (2^k)xN matrix Y with columns not in I all zero
> and the other columns with all choices of an entry from the
> first or second row of X.
>
> For example, with
> X <- matrix(1:8, nrow=2)
> I <- c(1,3)
>
> X is
> 1 3 5 7
> 2 4 6 8
>
> and Y should be
> 1 0 5 0
> 2 0 5 0
> 1 0 6 0
> 2 0 6 0
>
> The order of the rows is unimportant.
> ---
> I solved this using a loop over the rows of Y after forming
> some preliminary matrices. I think it could be improved.
>
> N <- NCOL(X)
> k <- length(I)
> G <- as.matrix(expand.grid(rep(list(c(1,2)),k)))
> Y <- matrix(0,nc=N,nr=NROW(G))
>
> for(i in 1:NROW(G)){
> ind <- rep(1,N)
> ind[I] <- G[i,]
> Y[i,] <- X[array(c(ind,1:N),dim=c(N,2))]
> }
> Y[,-I] <- 0
>
>
>
>
> David L. Reiner
>
> Rho Trading
> 440 S. LaSalle St -- Suite 620
> Chicago IL 60605
>
> 312-362-4963 (voice)
> 312-362-4941 (fax)
>
>
> ______________________________________________
> R-help at 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
>
More information about the R-help
mailing list