[R] dependent nested for loops in R

Shaami nz@h@@m @end|ng |rom gm@||@com
Mon Feb 1 13:03:55 CET 2021


Hi David and Charles

Your suggestions helped me a lot. Could you please suggest how I could
vectorize the following for loop?
z = NULL
p = 0.25
x = rnorm(100)
z[1] = p*x[1] + (1-p)*5
for(i in 2:100)
{
  z[i] = p*x[i]+(1-p)*z[i-1]
}
 Thank you

Regards

On Mon, Feb 1, 2021 at 11:01 AM David Winsemius <dwinsemius using comcast.net>
wrote:

>
> On 1/31/21 1:26 PM, Berry, Charles wrote:
> >
> >> On Jan 30, 2021, at 9:32 PM, Shaami <nzshaam using gmail.com> wrote:
> >>
> >> Hi
> >> I have made the sample code again. Could you please guide how to use
> >> vectorization for variables whose next value depends on the previous
> one?
> >>
>
> I agree with Charles that I suspect your results are not what you
> expect. You should try using cat or print to output intermediate results
> to the console. I would suggest you limit your examination to a more
> manageable length, say the first 10 results while you are working out
> your logic. After you have the logic debugged, you can move on to long
> sequences.
>
>
> This is my suggestion for a more compact solution (at least for the
> inner loop calculation):
>
> set.seed(123)
>
> x <- rnorm(2000)
>
> z <- Reduce( function(x,y) { sum(y+5*x) }, x, accumulate=TRUE)
>
> w<- numeric(2000)
>
> w <-  (1:2000)[ z >4 | z < 1 ]  # In your version the w values get
> overwritten and end up all being 2000
>
>
> I would also advise making a natural language statement of the problem
> and goals. I'm thinking that you may be missing certain aspects of the
> underying problem.
>
> --
>
> David.
>
> >
> > Glad to help.
> >
> > First, it could help you to trace your code.  I suspect that the results
> are not at all what you want and tracing would help you see that.
> >
> > I suggest running this revision and printing out x, z, and w.
> >
> > #+begin_src R
> >    w = NULL
> >    for(j in 1:2)
> >    {
> >      z = NULL
> >      x = rnorm(10)
> >      z[1] = x[1]
> >      for(i in 2:10)
> >      {
> >        z[i] = x[i]+5*z[i-1]
> >        if(z[i]>4 | z[i]<1) {
> >       w[j]=i
> >        } else {
> >       w[j] = 0
> >        }
> >      }
> >    }
> > #+end_src
> >
> >
> > You should be able to see that the value of w can easily be obtained
> outside of the `i' loop.
> >
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list