[R] dependent nested for loops in R

David Winsemius dw|n@em|u@ @end|ng |rom comc@@t@net
Tue Feb 2 07:15:57 CET 2021


Or perhaps: 

W <- 1:2000
W[z>4|z<2] <- 0

Sent from my iPhone

> On Feb 1, 2021, at 9:56 PM, David Winsemius <dwinsemius using comcast.net> wrote:
> 
> Or perhaps you wanted:
> 
> W <- z
> W[z>4|z<2] <- 0
> 
> Sent from my iPhone
> 
>>> On Feb 1, 2021, at 9:41 PM, David Winsemius <dwinsemius using comcast.net> wrote:
>>> 
>> Just drop the “+” if you want logical. 
>> 
>> Sent from my iPhone
>> 
>>>> On Feb 1, 2021, at 9:36 PM, Shaami <nzshaam using gmail.com> wrote:
>>>> 
>>> 
>>> Hi Prof. David
>>> 
>>> Thank you. I will always follow your advice. The suggested code worked. It gives either 1 or 0 depending on the condition to be true. I want index of z for which the condition is true (instead of 1) else zero. Could you please suggest? 
>>> 
>>> Thank you
>>> 
>>> Shaami
>>> 
>>>> On Tue, Feb 2, 2021 at 10:16 AM David Winsemius <dwinsemius using comcast.net> wrote:
>>>> Cc’ed the list as should always be your practice. 
>>>> 
>>>> Here’s one way (untested):
>>>> 
>>>> W <- +(z>4| z<2) # assume z is of length 20
>>>> 
>>>>>>>> David
>>>> 
>>>> Sent from my iPhone
>>>> 
>>>>>> On Feb 1, 2021, at 7:08 PM, Shaami <nzshaam using gmail.com> wrote:
>>>>>> 
>>>>> 
>>>>> Hi Prof. David
>>>>> 
>>>>> In the following state
>>>>> 
>>>>> W = (1:2000)[z >4|z<2)
>>>>> 
>>>>> Could you please guide how  I can assign zero if condition is not satisfied?
>>>>> 
>>>>> Best Regards 
>>>>> 
>>>>> Shaami
>>>>> 
>>>>>> On Mon, 1 Feb 2021, 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