Hi slight modification of your function can be probably even quicker:
fff<-function(x) sum(2^(which(rev(x))-1)) :-) Petr On 15 Feb 2007 at 12:13, Roland Rau wrote: Date sent: Thu, 15 Feb 2007 12:13:32 -0500 From: "Roland Rau" <[EMAIL PROTECTED]> To: "Bert Gunter" <[EMAIL PROTECTED]> Copies to: [EMAIL PROTECTED], r-help@stat.math.ethz.ch Subject: Re: [R] convert to binary to decimal > Hi Bert, > > First, I was very happy with my solution, but you win (see below)! > > Best, > Roland > > > > bert.gunter <- function(x) { > + sum(x * 2^(rev(seq(along=x)) - 1)) > + } > > > > marc.schwartz <- function(x) { > + x <- as.character(as.numeric(x)) > + b <- as.numeric(unlist(strsplit(x, ""))) > + pow <- 2 ^ ((length(b) - 1):0) > + sum(pow[b == 1]) > + } > > > > length(huge.list) > [1] 20000 > > head(huge.list, n=1) > [[1]] > [1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE FALSE > TRUE > FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE > [21] FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE > TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE [41] FALSE FALSE > FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE > > > > > system.time(lapply(X=huge.list, FUN=bin2dec.easy)) > [1] 2.33 0.00 2.32 NA NA > > system.time(lapply(X=huge.list, FUN=bin2dec.recursive)) > [1] 14.91 0.00 14.90 NA NA > > system.time(lapply(X=huge.list, FUN=marc.schwartz)) > [1] 5.31 0.00 5.31 NA NA > > system.time(lapply(X=huge.list, FUN=bert.gunter)) > [1] 1.33 0.00 1.33 NA NA > > > > > > On 2/15/07, Bert Gunter <[EMAIL PROTECTED]> wrote: > > > > why not simply: > > > > sum(x * 2^(rev(seq_along(x)) - 1)) ? > > > > > > Bert Gunter > > Genentech Nonclinical Statistics > > South San Francisco, CA 94404 > > 650-467-7374 > > > > > > Bert Gunter > > Nonclinical Statistics > > 7-7374 > > > > -----Original Message----- > > From: [EMAIL PROTECTED] > > [mailto:[EMAIL PROTECTED] On Behalf Of Roland Rau > > Sent: Thursday, February 15, 2007 8:22 AM To: > > [EMAIL PROTECTED] Cc: r-help@stat.math.ethz.ch Subject: Re: > > [R] convert to binary to decimal > > > > That was a nice quick distraction. Unfortunately, I am not the first > > to answer. :-( Anyway, I offer two solutions (which are different > > from the one of Marc Schwartz); I wrote it quickly but I hope they > > are correct. > > > > Enjoy and thanks, > > Roland > > > > a <- c(TRUE, FALSE, TRUE) > > b <- c(TRUE, FALSE, TRUE, TRUE) > > > > bin2dec.easy <- function(binaryvector) { > > sum(2^(which(rev(binaryvector)==TRUE)-1)) > > } > > > > bin2dec.recursive <- function(binaryvector) { > > reversed.input <- rev(binaryvector) > > binaryhelper(reversed.input, 0, 0) > > } > > > > binaryhelper <- function(binvector, currentpower, currentresult) { > > if (length(binvector)<1) { > > currentresult > > } else { > > if (binvector[1]) { > > binaryhelper(binvector[-1], currentpower+1, > > currentresult+2^currentpower) > > } else { > > binaryhelper(binvector[-1], currentpower+1, currentresult) > > } > > } > > } > > > > > > bin2dec.easy(a) > > bin2dec.recursive(a) > > bin2dec.easy(b) > > bin2dec.recursive(b) > > > > > > > > > > > > On 2/15/07, Marc Schwartz <[EMAIL PROTECTED]> wrote: > > > > > > On Thu, 2007-02-15 at 16:38 +0100, Martin Feldkircher wrote: > > > > Hello, > > > > we need to convert a logical vector to a (decimal) integer. > > > > Example: > > > > > > > > a=c(TRUE, FALSE, TRUE) (binary number 101) > > > > > > > > the function we are looking for should return > > > > > > > > dec2bin(a)=5 > > > > > > > > Is there a package for such a function or is it even implemented > > > > in > > the > > > > base package? We found the hexmode and octmode command, but not > > > > a binmode. We know how to program it ourselves however we are > > > > looking > > for > > > > a computationally efficient algorithm. > > > > > > > > Martin and Stefan > > > > > > This is a modification of a function that I had posted a while > > > back, so that it handles 'x' as a logical vector. I added the > > > first line in the function to convert the logical vector to it's > > > numeric equivalent and then coerce to character: > > > > > > bin2dec <- function(x) > > > { > > > x <- as.character(as.numeric(x)) > > > b <- as.numeric(unlist(strsplit(x, ""))) > > > pow <- 2 ^ ((length(b) - 1):0) > > > sum(pow[b == 1]) > > > } > > > > > > > > > a <- c(TRUE, FALSE, TRUE) > > > > > > > bin2dec(a) > > > [1] 5 > > > > > > HTH, > > > > > > Marc Schwartz > > > > > > ______________________________________________ > > > R-help@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 > > > and provide commented, minimal, self-contained, reproducible code. > > > > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@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 > > and provide commented, minimal, self-contained, reproducible code. > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@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 and provide commented, > minimal, self-contained, reproducible code. Petr Pikal [EMAIL PROTECTED] ______________________________________________ R-help@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 and provide commented, minimal, self-contained, reproducible code.