I'm using functions to return a matrix of all permutations of a specified size from a larger list for predictor selection. For each predictor size I use a seperate function like this: bag2 <- function(n) { rl <- c() for (i1 in seq(n)) { for (i2 in seq(n)) { if (length(unique(c(i1,i2)))==1) {next} rl <- cbind(rl,matrix(c(i1,i2))) } } rl } bag3 <- function(n) { rl <- c() for (i1 in seq(n)) { for (i2 in seq(n)) { for (i3 in seq(n)) { if (length(unique(c(i1,i2,i3)))==1) {next} rl <- cbind(rl,matrix(c(i1,i2,i3))) } } } rl } But I think it should be somehow possible in R to use one general function for all sizes. Can someone help? I don't exactly know how this kind of permutation is called, maybe this would help to find a solution. Nick
Nick Fankhauser wrote:> I'm using functions to return a matrix of all permutations of a > specified size from a larger list for predictor selection. > For each predictor size I use a seperate function like this: > > bag2 <- function(n) { > rl <- c() > for (i1 in seq(n)) { > for (i2 in seq(n)) { > if (length(unique(c(i1,i2)))==1) {next} > rl <- cbind(rl,matrix(c(i1,i2))) > } > } > rl > } > > bag3 <- function(n) { > rl <- c() > for (i1 in seq(n)) { > for (i2 in seq(n)) { > for (i3 in seq(n)) { > if (length(unique(c(i1,i2,i3)))==1) {next} > rl <- cbind(rl,matrix(c(i1,i2,i3))) > } > } > } > rl > } > > But I think it should be somehow possible in R to use one general > function for all sizes. Can someone help? > I don't exactly know how this kind of permutation is called, maybe this > would help to find a solution. > > Nick >Looks to me like you're just doing expand.grid, but without the 'all variables equal' cases. If that's correct and if n > 1, then this might do it: bag <- function(n,K){ L <- vector(mode='list', length=K) L <- lapply(L, function(x) {x <- seq_len(n)}) d <- expand.grid(L) keeprow <- apply(d, 1, function(x) {var(x)!=0}) ## I'm blanking out on a better way to test for equal values td <- t(as.matrix(d[keeprow,])) dimnames(td) <- c(NULL, NULL) rtd <- td[nrow(td):1,] rtd } all.equal(bag(5,2), bag2(5)) #[1] TRUE all.equal(bag(9,3), bag3(9)) #[1] TRUE -Peter Ehlers
Try this: v <- 1:5 n <- 2 t(subset(do.call(expand.grid, replicate(n, v, FALSE))[n:1], Var1 != Var2)) On Thu, Jan 14, 2010 at 9:51 AM, Nick Fankhauser <lists at nyk.ch> wrote:> I'm using functions to return a matrix of all permutations of a > specified size from a larger list for predictor selection. > For each predictor size I use a seperate function like this: > > bag2 <- function(n) { > ? ?rl <- c() > ? ?for (i1 in seq(n)) { > ? ? ? ?for (i2 in seq(n)) { > ? ? ? ? ? ?if (length(unique(c(i1,i2)))==1) {next} > ? ? ? ? ? ?rl <- cbind(rl,matrix(c(i1,i2))) > ? ? ? ?} > ? ?} > ? ?rl > } > > bag3 <- function(n) { > ? ?rl <- c() > ? ?for (i1 in seq(n)) { > ? ? ? ?for (i2 in seq(n)) { > ? ? ? ? ? ?for (i3 in seq(n)) { > ? ? ? ? ? ? ? ?if (length(unique(c(i1,i2,i3)))==1) {next} > ? ? ? ? ? ? ? ?rl <- cbind(rl,matrix(c(i1,i2,i3))) > ? ? ? ? ? ?} > ? ? ? ?} > ? ?} > ? ?rl > } > > But I think it should be somehow possible in R to use one general > function for all sizes. Can someone help? > I don't exactly know how this kind of permutation is called, maybe this > would help to find a solution. > > Nick > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Henrique Dallazuanna Curitiba-Paran?-Brasil 25? 25' 40" S 49? 16' 22" O