[R] Question Regarding a nested for loop in R

MCGUIRE, Rhydwyn rmcgu at doh.health.nsw.gov.au
Fri Dec 4 06:49:58 CET 2015


Hi Ryan, 

I don't think you need the outer loop, loops are worth avoiding if you can possibly can because they are inefficient, have a look at this dplyr tutorial (https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html) which should be able to achieve what your outer loop is currently doing. Vectorisation (applying a calculation to a whole array) should be able to process your innerloop. 

Good luck

Rhydwyn 


-----Original Message-----
From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Vermilio, Ryan
Sent: Friday, 4 December 2015 9:43 AM
To: r-help at r-project.org
Subject: [R] Question Regarding a nested for loop in R


Hello there,

I'm an R novice and am trying to figure out how to create an external for loop.  My current loop iterates 15 times and stores the resulting values in 3 separate vectors.  What I need is to create an outside loop that will run internal loop 4 times, sum the resulting vectors for each, and then store the sum of each in a vector of length 4 for each investment.

Right now, the target vector has the same value in each position, which is what I'm trying to fix.

Here's what I have at this point:

Inv1Returns <- c(0, 1000, -500, 500)
Inv2Returns <- c(0, -9000, 30000, 10000) Inv3Returns <- c(0, 4000, -1000, -2000)

random = runif(15, 0, 1)

Inv1Outcome = NULL
Inv2Outcome = NULL
Inv3Outcome = NULL

Inv1Total = NULL
Inv2Total = NULL
Inv3Total = NULL

for (j in 1:4)

{

for (i in 1:15 )

{

  Inv1Outcome[i] = if (random[i] <= .25){Inv1Returns[1]}
  else if (random[i] > .25 & random[i] <= .50){Inv1Returns[2]}
  else if (random[i] > .50 & random[i] <= .75){Inv1Returns[3]}
  else {Inv1Returns[4]}

  Inv2Outcome[i] = if (random[i] <= .20){Inv2Returns[1]}
  else if (random[i] > .20 & random[i] <= .30){Inv2Returns[2]}
  else if (random[i] > .30 & random[i] <= .70){Inv2Returns[3]}
  else {Inv2Returns[4]}

  Inv3Outcome[i] = if (random[i] <= .50){Inv3Returns[1]}
  else if (random[i] > .50 & random[i] <= .70){Inv3Returns[2]}
  else if (random[i] > .70 & random[i] <= .90){Inv3Returns[3]}
  else {Inv3Returns[4]}

}

Inv1Total = append(Inv1Total, sum(Inv1Outcome)) Inv2Total = append(Inv2Total, sum(Inv2Outcome)) Inv3Total = append(Inv3Total, sum(Inv3Outcome))

}

Inv1Total
Inv2Total
Inv3Total


Sincerely,

Ryan

	[[alternative HTML version deleted]]

______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.
__________________________________________________________________________________________________________
This email has been scanned for the NSW Ministry of Health by the Websense Hosted Email Security System.
Emails and attachments are monitored to ensure compliance with the NSW Ministry of health's Electronic Messaging Policy.
__________________________________________________________________________________________________________
_______________________________________________________________________________________________________
Disclaimer: This message is intended for the addressee named and may contain confidential information.
If you are not the intended recipient, please delete it and notify the sender.
Views expressed in this message are those of the individual sender, and are not necessarily the views of the NSW Ministry of Health.
_______________________________________________________________________________________________________
This email has been scanned for the NSW Ministry of Health by the Websense Hosted Email Security System.
Emails and attachments are monitored to ensure compliance with the NSW Ministry of Health's Electronic Messaging Policy.



More information about the R-help mailing list