 ## R Exercises – 71-80 – Loops (For Loop, Which Loop, Repeat Loop), If and Ifelse Statements in R

1. Simple ifelse statement

Create the data frame ‘student.df’ with the data provided below:

```student.df = data.frame( name = c("Sue", "Eva", "Henry", "Jan"),
sex = c("f", "f", "m", "m"),
years = c(21,31,29,19)); student.df
```

Use a simple ‘ifelse’ statement to add a new column ‘male.teen’ to the data frame. This is a boolean column, indicating T if the observation is a male younger than 20 years.

```#expected result

name sex years male.teen
1   Sue   f    21         F
2   Eva   f    31         F
3 Henry   m    29         F
4   Jan   m    19         T
```
```student.df = data.frame( name = c("Sue", "Eva",           "Henry", "Jan"),           sex = c("f", "f", "m", "m"),           years = c(21,31,29,19)); student.df student.df\$male.teen = ifelse(student.df\$sex == "m" &           student.df\$years < 20, "T", "F") student.df```

2. Double for loop

Write a double for loop which prints 30 numbers (1:10, 2:11, 3:12). Those are three clusters of ten numbers each. The first loop determines the number of clusters (3) via its length; the second loop the numbers to be printed (1 to 10 at the beginning). Each cluster starts one number higher than the previous one.

```#expected result

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
```
```for (i in 1:length(1:3)) {          for (j in 1:10) {             print(j+i-1)          }}```

3. Simple repeat loop

Write a repeat loop containing three random numbers. The loop repeats itself exactly ten times before it stops.

```#expected result

 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
 0.1932123 -0.4346821 0.9132671
```
```set.seed(23) randomnr <- rnorm(3) reps <- 1 repeat {     print(randomnr)     reps <- reps + 1     if(reps > 10) {        break}}```

4. For loop combined with if statement

Write a for loop that prints the Displacement (‘disp’) of the ‘mtcars’ dataset.
a. This loop will only print observations of 160 or higher in ‘disp’.
b. This loop will stop as soon as an observation is smaller than 160 in ‘disp’.

```#expected result

#a
 160
 160
 258
 360
 225
 360
 167.6
 167.6
[...]

#b
 160
 160
```
```for (i in mtcars\$disp){    if(i<160)      next    print (i)} for (i in mtcars\$disp){    if(i<160)      break    print (i)}```

5. Adding a new column to a data.frame – NA handling

a. You have the data.frame ‘mydf’ with four columns like below.

```a = c(3,7,NA, 9)
b = c(2,NA,9,3)
f = c(5,2,5,6)
d = c(NA,3,4,NA)

mydf = data.frame(a=a,b=b,f=f,d=d);mydf
```

b. You want to add another column ‘5’:

• the 5th column contains the value of col 2 if col 1 is NA;
• the 5th column contains the value of col 4 if col 2 is NA;
• the 5th column contains the value of col 3 in all other cases.
```#expected result

a  b f  d V5
1  3  2 5 NA  5
2  7 NA 2  3  3
3 NA  9 5  4  9
4  9  3 6 NA  6
```
```a = c(3,7,NA, 9) b = c(2,NA,9,3) f = c(5,2,5,6) d = c(NA,3,4,NA) mydf = data.frame(a=a,b=b,f=f,d=d);mydf mydf[,5] <- ifelse(is.na(mydf[,1]) & !is.na(mydf[,2]),                mydf[,2],                ifelse(is.na(mydf[,2]) & !is.na(mydf[,4]),                mydf[,4], mydf[,3])) mydf```

6. Simple while loop

Write a while loop starting with x = 0. The loop prints all numbers up to 35 but it skips number 7.

```#expected result

 1
 2
 3
 4
 5
 6
 8
 9
 10
 11
[...]
```
```x = 0 while(x < 35) {     x = x+1     if (x == 7) next     print(x)}```

7. While loop – multi matches

We are using the same while loop as in the last exercise. The loop prints again all numbers up to 35, but this time it skips a whole vector of numbers: 3,9,13,19,23,29.

```#expected result

 1
 2
 4
 5
 6
 7
 8
 10
 11
 12
 14
 15
 16
 17
 18
 20
 21
 22
 24
 25
 26
 27
 28
 30
 31
 32
 33
 34
 35
```
```exclude = c(3,9,13,19,23,29) x = 0 while(x < 35) {      x = x+1      if (x %in% exclude) next      print(x)}```

8. Urn experiment – advanced exercise

You have an urn with balls from 1 to 100. You want to find out how often you need to draw a ball to get number 55. This is an experiment with replacement – you put the ball back each time you draw. Simulate 1000 runs of the experiment to get an accurate estimation of the required draws.

Use seed 23 to make the experiment reproducible. Use loops (for, while) for the solution.

```set.seed(23)

#expected result

 97.256
```
```set.seed(23) repetitions <- 1000 urn <- c(1:100) # container of 100 numbers trialsto100 <- 0 # trials to get the desired number for (i in 1:repetitions){      num <- 0 # the sampled number      trials <- 0      while(num != 55){ # we want number 55        num <-sample(urn, 1, F) # sampling of the urn        trials <- trials + 1 # looping the trials until we get the desired output }      trialsto100 <- trialsto100 + trials # updating the number of trials } trialsto100/repetitions```

9. Simulating a pair of dice – hard

Get 1000 simulations of a paired dice game.

• A game immediately stops if you have an initial total (2 dice) of 5,6,7,8,9.
• If the first cast does not meet those 5 totals you would continue until you get either 11 or 12.
• What is the average number of dice casts per game?
```set.seed(23)

#expected result

 5.011
```
```set.seed(23) n.sim = 1000 # number of simulations cts = rep(0, n.sim) # counts of dice casts x = NULL # container for the current cast total for (i in 1:n.sim) {    start = c(sample(1:6,1) + sample(1:6,1)) # a pair of dice    cts[i] = cts[i] + 1 # update of cast counts    x = start    if(x %in% c(5,6,7,8,9)){ # initial target totals      next} # stop the game if this total is casted    repeat {      x = c(sample(1:6,1) + sample(1:6,1))      cts[i] = cts[i] + 1      if(x %in% c(11, 12)){ # new target of the repeat loop        break      }}} mean(cts)```

10. River classifications

Use the ‘rivers’ dataset to write a for loop. The loop prints the dataset:

• rivers shorter than 500 are a ‘short river’;
• rivers longer than 2000 are a ‘long river’;
• and rivers in the middle range are printed in their original numbers.
```#expected result

 735
 "short river"
 "short river"
 "short river"
 524
 "short river"
 1459
 "short river"
 "short river"
 600
 "short river"
[...]
```
```for (i in rivers){    if(i<500){      print("short river")    } else if (i>2000) {      print("long river")    } else{      print(i)} }```