So my company has hired a few young McKinsey guys from overseas for a couple of weeks to help us with a production line optimization. They probably charge what I make in a year, but that's OK because I just never have the time to really dive into one particular time, and I have to hand it to the consultants that they came up with one or two really clever ideas to model the production line. Of course it's up to me to feed them the real data which they then churn through their Excel models that they cook up during the nights in their hotel rooms, and which I then implement back into my experimental system using live data. Anyway, whenever they need something or come up with something I skip out of the room, hack it into R, export the CSV and come back in about half the time it takes Excel to even read in the data, let alone process it. Of course that gor them curious, and I showed off a couple of scripts that condense their abysmal Excel convolutions in a few lean and mean lines of R code. Anyway, I'm in my office with this really attractive, clever young McKinsey girl (I'm in my mid-forties, married with kids and all, but I still enjoyed impressing a woman with computer stuff, of all things!), and one of her models involves a simple permutation of five letters -- "A" through "E". And that's when I find out that R doesn't have a permutation function. How is that possible? R has EVERYTHING, but not that? I'm flabbergasted. Stumped. And now it's up to me to spend the evening at home coding that model, and the only thing I really need is that permutation. So this is my first attempt: perm.broken <- function(x) { if (length(x) == 1) return(x) sapply(1:length(x), function(i) { cbind(x[i], perm(x[-i])) }) } But it doesn't work:> perm.broken(c("A", "B", "C"))[,1] [,2] [,3] [1,] "A" "B" "C" [2,] "A" "B" "C" [3,] "B" "A" "A" [4,] "C" "C" "B" [5,] "C" "C" "B" [6,] "B" "A" "A">And I can't figure out for the life of me why. It should work because I go through the elements of x in order, use that in the leftmost column, and slap the permutation of the remaining elements to the right. What strikes me as particularly odd is that there doesn't even seem to be a systematic sequence of letters in any of the columns. OK, since I really need that function I wrote this piece of crap: perm.stupid <- function(x) { b <- as.matrix(expand.grid(rep(list(x), length(x)))) b[!sapply(1:nrow(b), function(r) any(duplicated(b[r,]))),] } It works, but words cannot describe its ugliness. And it gets really slow really fast with growing x. So, anyway. My two questions are: 1. Does R really, really, seriously lack a permutation function? 2. OK, stop kidding me. So what's it called? 3. Why doesn't my recursive function work, and what would a working version look like? Thanks, robert
It is called sample(,replace=F), where the default argument is sampling without replacement. Try x <- c("A","B","C","D","E") sample(x) Brian Brian S. Cade, PhD U. S. Geological Survey Fort Collins Science Center 2150 Centre Ave., Bldg. C Fort Collins, CO 80526-8818 email: cadeb@usgs.gov <brian_cade@usgs.gov> tel: 970 226-9326 On Wed, Jun 25, 2014 at 2:22 PM, Robert Latest <boblatest@gmail.com> wrote:> So my company has hired a few young McKinsey guys from overseas for a > couple of weeks to help us with a production line optimization. They > probably charge what I make in a year, but that's OK because I just > never have the time to really dive into one particular time, and I have > to hand it to the consultants that they came up with one or two really > clever ideas to model the production line. Of course it's up to me to > feed them the real data which they then churn through their Excel > models that they cook up during the nights in their hotel rooms, and > which I then implement back into my experimental system using live data. > > Anyway, whenever they need something or come up with something I skip > out of the room, hack it into R, export the CSV and come back in about > half the time it takes Excel to even read in the data, let alone > process it. Of course that gor them curious, and I showed off a couple > of scripts that condense their abysmal Excel convolutions in a few > lean and mean lines of R code. > > Anyway, I'm in my office with this really attractive, clever young > McKinsey girl (I'm in my mid-forties, married with kids and all, but I > still enjoyed impressing a woman with computer stuff, of all things!), > and one of her models involves a simple permutation of five letters -- > "A" through "E". > > And that's when I find out that R doesn't have a permutation function. > How is that possible? R has EVERYTHING, but not that? I'm > flabbergasted. Stumped. And now it's up to me to spend the evening at > home coding that model, and the only thing I really need is that > permutation. > > So this is my first attempt: > > perm.broken <- function(x) { > if (length(x) == 1) return(x) > sapply(1:length(x), function(i) { > cbind(x[i], perm(x[-i])) > }) > } > > But it doesn't work: > > perm.broken(c("A", "B", "C")) > [,1] [,2] [,3] > [1,] "A" "B" "C" > [2,] "A" "B" "C" > [3,] "B" "A" "A" > [4,] "C" "C" "B" > [5,] "C" "C" "B" > [6,] "B" "A" "A" > > > > And I can't figure out for the life of me why. It should work because I > go through the elements of x in order, use that in the leftmost column, > and slap the permutation of the remaining elements to the right. What > strikes me as particularly odd is that there doesn't even seem to be a > systematic sequence of letters in any of the columns. OK, since I > really need that function I wrote this piece of crap: > > perm.stupid <- function(x) { > b <- as.matrix(expand.grid(rep(list(x), length(x)))) > b[!sapply(1:nrow(b), function(r) any(duplicated(b[r,]))),] > } > > It works, but words cannot describe its ugliness. And it gets really > slow really fast with growing x. > > So, anyway. My two questions are: > 1. Does R really, really, seriously lack a permutation function? > 2. OK, stop kidding me. So what's it called? > 3. Why doesn't my recursive function work, and what would a > working version look like? > > Thanks, > robert > > ______________________________________________ > R-help@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. >[[alternative HTML version deleted]]
The brokenness of your perm.broken function arises from the attempted use of sapply to bind matrices together, which is not something sapply does. perm.fixed <- function( x ) { if ( length( x ) == 1 ) return( matrix( x, nrow=1 ) ) lst <- lapply( seq_along( x ) , function( i ) { cbind( x[ i ], perm.jdn( x[ -i ] ) ) } ) do.call(rbind, lst) } On Wed, 25 Jun 2014, Robert Latest wrote:> So my company has hired a few young McKinsey guys from overseas for a > couple of weeks to help us with a production line optimization. They > probably charge what I make in a year, but that's OK because I just > never have the time to really dive into one particular time, and I have > to hand it to the consultants that they came up with one or two really > clever ideas to model the production line. Of course it's up to me to > feed them the real data which they then churn through their Excel > models that they cook up during the nights in their hotel rooms, and > which I then implement back into my experimental system using live data. > > Anyway, whenever they need something or come up with something I skip > out of the room, hack it into R, export the CSV and come back in about > half the time it takes Excel to even read in the data, let alone > process it. Of course that gor them curious, and I showed off a couple > of scripts that condense their abysmal Excel convolutions in a few > lean and mean lines of R code. > > Anyway, I'm in my office with this really attractive, clever young > McKinsey girl (I'm in my mid-forties, married with kids and all, but I > still enjoyed impressing a woman with computer stuff, of all things!), > and one of her models involves a simple permutation of five letters -- > "A" through "E". > > And that's when I find out that R doesn't have a permutation function. > How is that possible? R has EVERYTHING, but not that? I'm > flabbergasted. Stumped. And now it's up to me to spend the evening at > home coding that model, and the only thing I really need is that > permutation. > > So this is my first attempt: > > perm.broken <- function(x) { > if (length(x) == 1) return(x) > sapply(1:length(x), function(i) { > cbind(x[i], perm(x[-i])) > }) > } > > But it doesn't work: >> perm.broken(c("A", "B", "C")) > [,1] [,2] [,3] > [1,] "A" "B" "C" > [2,] "A" "B" "C" > [3,] "B" "A" "A" > [4,] "C" "C" "B" > [5,] "C" "C" "B" > [6,] "B" "A" "A" >> > > And I can't figure out for the life of me why. It should work because I > go through the elements of x in order, use that in the leftmost column, > and slap the permutation of the remaining elements to the right. What > strikes me as particularly odd is that there doesn't even seem to be a > systematic sequence of letters in any of the columns. OK, since I > really need that function I wrote this piece of crap: > > perm.stupid <- function(x) { > b <- as.matrix(expand.grid(rep(list(x), length(x)))) > b[!sapply(1:nrow(b), function(r) any(duplicated(b[r,]))),] > } > > It works, but words cannot describe its ugliness. And it gets really > slow really fast with growing x. > > So, anyway. My two questions are: > 1. Does R really, really, seriously lack a permutation function? > 2. OK, stop kidding me. So what's it called? > 3. Why doesn't my recursive function work, and what would a > working version look like? > > Thanks, > robert > > ______________________________________________ > 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. >--------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k
For your 2nd question (which also answers your first question) I use the permn function in the combinat package, this function is nice that in addition to generating all the permutations it will also, optionally, run a function on each permutation for you:> t(simplify2array( permn( c("A","B","C") ) ))[,1] [,2] [,3] [1,] "A" "B" "C" [2,] "A" "C" "B" [3,] "C" "A" "B" [4,] "C" "B" "A" [5,] "B" "C" "A" [6,] "B" "A" "C"> unlist( permn( c("A","B","C"), fun=paste, collapse='' ) )[1] "ABC" "ACB" "CAB" "CBA" "BCA" "BAC" In addition, running help.search on my computer (RSiteSearch, or the SOS package may return even more) shows the following functions as generating permutations: combinat::permn e1071::permutations gtools::permutations multicool::allPerm pracma::perms prob::permsn sna::numperm On Wed, Jun 25, 2014 at 2:22 PM, Robert Latest <boblatest at gmail.com> wrote:> So my company has hired a few young McKinsey guys from overseas for a > couple of weeks to help us with a production line optimization. They > probably charge what I make in a year, but that's OK because I just > never have the time to really dive into one particular time, and I have > to hand it to the consultants that they came up with one or two really > clever ideas to model the production line. Of course it's up to me to > feed them the real data which they then churn through their Excel > models that they cook up during the nights in their hotel rooms, and > which I then implement back into my experimental system using live data. > > Anyway, whenever they need something or come up with something I skip > out of the room, hack it into R, export the CSV and come back in about > half the time it takes Excel to even read in the data, let alone > process it. Of course that gor them curious, and I showed off a couple > of scripts that condense their abysmal Excel convolutions in a few > lean and mean lines of R code. > > Anyway, I'm in my office with this really attractive, clever young > McKinsey girl (I'm in my mid-forties, married with kids and all, but I > still enjoyed impressing a woman with computer stuff, of all things!), > and one of her models involves a simple permutation of five letters -- > "A" through "E". > > And that's when I find out that R doesn't have a permutation function. > How is that possible? R has EVERYTHING, but not that? I'm > flabbergasted. Stumped. And now it's up to me to spend the evening at > home coding that model, and the only thing I really need is that > permutation. > > So this is my first attempt: > > perm.broken <- function(x) { > if (length(x) == 1) return(x) > sapply(1:length(x), function(i) { > cbind(x[i], perm(x[-i])) > }) > } > > But it doesn't work: >> perm.broken(c("A", "B", "C")) > [,1] [,2] [,3] > [1,] "A" "B" "C" > [2,] "A" "B" "C" > [3,] "B" "A" "A" > [4,] "C" "C" "B" > [5,] "C" "C" "B" > [6,] "B" "A" "A" >> > > And I can't figure out for the life of me why. It should work because I > go through the elements of x in order, use that in the leftmost column, > and slap the permutation of the remaining elements to the right. What > strikes me as particularly odd is that there doesn't even seem to be a > systematic sequence of letters in any of the columns. OK, since I > really need that function I wrote this piece of crap: > > perm.stupid <- function(x) { > b <- as.matrix(expand.grid(rep(list(x), length(x)))) > b[!sapply(1:nrow(b), function(r) any(duplicated(b[r,]))),] > } > > It works, but words cannot describe its ugliness. And it gets really > slow really fast with growing x. > > So, anyway. My two questions are: > 1. Does R really, really, seriously lack a permutation function? > 2. OK, stop kidding me. So what's it called? > 3. Why doesn't my recursive function work, and what would a > working version look like? > > Thanks, > robert > > ______________________________________________ > 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.-- Gregory (Greg) L. Snow Ph.D. 538280 at gmail.com