17.3 Updating a container object with a loop
For many loops, you may want to update values of a ‘container’ object with each iteration of a loop. We can easily do this using indexing and assignment within a loop.
Let’s do an example with the examscores
dataframe. We’ll use a loop to calculate how many students failed each of the 4 exams – where failing is a score less than 50. To do this, we will start by creating an NA vector called failure.percent
. This will be a container object that we’ll update later with the loop.
We will then use a loop that fills this object with the percentage of failures for each exam. The loop will go over each column in examscores
, calculates the percentage of scores less than 50 for that column, and assigns the result to the ith value of failure.percent
. For the loop, our loop object will be i
and our loop vector will be 1:4
.
for(i in 1:4) { # Loop over columns 1 through 4
# Get the scores for the ith column
x <- examscores[,i]
# Calculate the percent of failures
failures.i <- mean(x < 50)
# Assign result to the ith value of failure.percent
failure.percent[i] <- failures.i
}
Now let’s look at the result.
It looks like about 50% of the students failed exam 1, everyone (100%) failed exam 2, 3% failed exam 3, and 97% percent failed exam 4. To calculate failure.percent
without a loop, we’d do the following:
# Calculate failure percent without a loop
failure.percent <- rep(NA, 4)
failure.percent[1] <- mean(examscores[,1] < 50)
failure.percent[2] <- mean(examscores[,2] < 50)
failure.percent[3] <- mean(examscores[,3] < 50)
failure.percent[4] <- mean(examscores[,4] < 50)
failure.percent
## [1] 0.50 1.00 0.03 0.97
As you can see, the results are identical.