[R] creating a reverse geometric sequence

2010-05-23 Thread Erik Iverson

Hello,

Can anyone think of a non-iterative way to generate a decreasing geometric 
sequence in R?


For example, for a hypothetical function dg, I would like:

 dg(20)
[1] 20 10 5 2 1

where I am using integer division by 2 to get each subsequent value in the 
sequence.



There is of course:

dg - function(x) {
  res - integer()
  while(x = 1) {
res - c(res, x)
x - x %/% 2
  }
  res
}

 dg(20)
[1] 20 10  5  2  1

This implementation of 'dg' uses an interative 'while' loop.  I'm simply 
wondering if there is a way to vectorize this process?


Thanks,
Erik

__
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.


Re: [R] creating a reverse geometric sequence

2010-05-23 Thread Duncan Murdoch

Erik Iverson wrote:

Hello,

Can anyone think of a non-iterative way to generate a decreasing geometric 
sequence in R?


For example, for a hypothetical function dg, I would like:

  dg(20)
[1] 20 10 5 2 1

where I am using integer division by 2 to get each subsequent value in the 
sequence.



There is of course:

dg - function(x) {
   res - integer()
   while(x = 1) {
 res - c(res, x)
 x - x %/% 2
   }
   res
}

  dg(20)
[1] 20 10  5  2  1

This implementation of 'dg' uses an interative 'while' loop.  I'm simply 
wondering if there is a way to vectorize this process?
  

Something like this should work, at least for integer bases:

base - 2
len - ceiling(log(x, base))
floor(x/base^(seq_len(len)-1))


Duncan Murdoch

__
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.


Re: [R] creating a reverse geometric sequence

2010-05-23 Thread Dan Davison
Erik Iverson er...@ccbr.umn.edu writes:

 Hello,

 Can anyone think of a non-iterative way to generate a decreasing
 geometric sequence in R?

 For example, for a hypothetical function dg, I would like:

 dg(20)
 [1] 20 10 5 2 1

 where I am using integer division by 2 to get each subsequent value in
 the sequence.


 There is of course:

 dg - function(x) {
   res - integer()
   while(x = 1) {
 res - c(res, x)
 x - x %/% 2
   }
   res
 }

 dg(20)
 [1] 20 10  5  2  1

 This implementation of 'dg' uses an interative 'while' loop.  I'm
 simply wondering if there is a way to vectorize this process?

Hi Erik,

How about

dg - function(x) {
maxi - floor(log(x)/log(2))
floor(x / (2^(0:maxi)))
}

I don't think the remainders cause a problem.

Dan


 Thanks,
 Erik

__
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.


Re: [R] creating a reverse geometric sequence

2010-05-23 Thread Ben Bolker
Erik Iverson eriki at ccbr.umn.edu writes:

 Can anyone think of a non-iterative way to generate a decreasing geometric 
 sequence in R?

Reduce(%/%,rep(2,4),init=20,accum=TRUE)

__
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.


Re: [R] creating a reverse geometric sequence

2010-05-23 Thread David Winsemius


On May 23, 2010, at 1:43 PM, Erik Iverson wrote:


Hello,

Can anyone think of a non-iterative way to generate a decreasing  
geometric sequence in R?


For example, for a hypothetical function dg, I would like:

 dg(20)
[1] 20 10 5 2 1

where I am using integer division by 2 to get each subsequent value  
in the sequence.


 dg - function(ratio, len) (ratio)^( 0:(len-1) )

 20*dg(.5, 20)
 [1] 2.00e+01 1.00e+01 5.00e+00 2.50e+00 1.25e+00  
6.25e-01
 [7] 3.125000e-01 1.562500e-01 7.812500e-02 3.906250e-02 1.953125e-02  
9.765625e-03
[13] 4.882812e-03 2.441406e-03 1.220703e-03 6.103516e-04 3.051758e-04  
1.525879e-04

[19] 7.629395e-05 3.814697e-05

 (20*dg(.5, 20))[1:19] / (20*dg(.5, 20))[2:20]
 [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2




There is of course:

dg - function(x) {
 res - integer()
 while(x = 1) {
   res - c(res, x)
   x - x %/% 2
 }
 res
}

 dg(20)
[1] 20 10  5  2  1

This implementation of 'dg' uses an interative 'while' loop.  I'm  
simply wondering if there is a way to vectorize this process?


Thanks,
Erik

__
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.


David Winsemius, MD
West Hartford, CT

__
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.