Module 9 Loops and conditionals

This module considers programming with loops and conditional statements in R.

A template project for this module is given on Posit Cloud (open it and use it while reading the notes).

Learning path diagram

It is recommended that you follow the green learning path; however, you may like a different learning style. In the learning path diagram, there are links to alternative online content (video or reading). Note this is an alternative to the standard learning path that you may use instead (you should not do both). The learning path may also have extra content, that is NOT a part of syllabus (only look at it if you want more info)!

9.1 Learning outcomes

By the end of this module, you are expected to be able to:

  • Formulate conditional statements.
  • Use functions any and all.
  • Formulate loops in R using for and while statements.
  • Use function if_else.

The learning outcomes relate to the overall learning goals number 2, 4 and 10 of the course.

9.2 Conditionals and control flow

An excellent introduction to conditionals and if statements is given in Chapter 1 of the interactive DataCamp course Intermediate R. Please complete the chapter before continuing.

Some functions are also useful for comparing logical data types. Consider this example:

x <- c(1, 3, 5, 10, 2, 17, 11, NA, 4)
x > 10  # are the elements greater that 10
#> [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE    NA FALSE
any(x > 10)  # are any of the elements greater that 10
#> [1] TRUE
all(x > 10)  # are all of the elements greater that 10
#> [1] FALSE
all(x < 20)  # are all of the elements greater that 20
#> [1] NA
all(x < 20, na.rm = TRUE)  # are all of the elements greater that 20
#> [1] TRUE

That is, functions any and all can be used to join logical values in vectors.

Some if statements can be written alternatively using function if_else:

if_else(condition, true, false, missing = NULL)

For example:

x <- c(-5:5, NA)
x
#>  [1] -5 -4 -3 -2 -1  0  1  2  3  4  5 NA

## using if and for
res <- rep("", length(x))
for (i in seq_along(x)) {
  if (is.na(x[i])) res[i] <- "missing"
  else if (x[i] < 0) res[i] <- "negative"
  else res[i] <- "positive"
}
res
#>  [1] "negative" "negative" "negative" "negative" "negative" "positive" "positive" "positive"
#>  [9] "positive" "positive" "positive" "missing"

## implicit if statement
res <- rep("", length(x))
res
#>  [1] "" "" "" "" "" "" "" "" "" "" "" ""
res[x < 0] <- "negative"
res[x >= 0] <- "positive"
res[is.na(x)] <- "missing"
res
#>  [1] "negative" "negative" "negative" "negative" "negative" "positive" "positive" "positive"
#>  [9] "positive" "positive" "positive" "missing"

## using if_else
res <- if_else(x < 0, "negative", "positive", "missing")
res
#>  [1] "negative" "negative" "negative" "negative" "negative" "positive" "positive" "positive"
#>  [9] "positive" "positive" "positive" "missing"

9.3 Loops

An excellent introduction to conditionals and if statements is given in Chapter 2 of the interactive DataCamp course Intermediate R. Please complete the chapter before continuing (stop when Chapter 2 finishes).

Loops in R may be slow. However, not if you follow some golden rules:

  • Do not use a loop when a vectorized alternative exists.
  • Do not grow objects (via c, cbind, etc) during the loop - R has to create a new object and copy across the information just to add a new element or row/column. Instead, allocate an object to hold the results and fill it in during the loop.

As an example, consider the for loop with 4 iterations:

i_val <- c(1,2,6,9)
res <- rep(NA,4)
res
#> [1] NA NA NA NA
for (idx in 1:length(i_val)) {
  res[idx] <- 6 * i_val[idx] + 9
}
res
#> [1] 15 21 45 63

Note we allocate memory for the result vector before the loop so we do not have to grow the result object. Next, we calculate results \(6i+9\) using a loop. Be careful here! This is not the same:

res <- rep(NA,4)
for (i in i_val) {
  res[i] <- 6 * i + 9
}
res
#> [1] 15 21 NA NA NA 45 NA NA 63

In this example, however, we can use a vectorized alternative:

res <- 6 * i_val + 9
res
#> [1] 15 21 45 63

where the operation is applied to each element in the vector.

Nested for loops is also possible. A simple example of a nested loop:

for (i in 1:3) {
  for (j in 1:2) {
    cat(str_c("i =", i, " j = ",j, "\n"))
  }
}
#> i =1 j = 1
#> i =1 j = 2
#> i =2 j = 1
#> i =2 j = 2
#> i =3 j = 1
#> i =3 j = 2

We here use the function cat to print out a string (\n indicates new line). Note how the nested loops are executed:

  • Set i = 1 (outer loop)
    • Set j = 1 (inner loop), i stays 1
    • Set j = 2 (inner loop), i stays 1
    • Inner loop finishes, proceed with outer loop.
  • Increase i = 2 (outer loop)
    • Set j = 1 (inner loop), i stays 2
    • Set j = 2 (inner loop), i stays 2
    • Inner loop finishes, proceed with outer loop.
  • Increase i = 3 (outer loop)
    • Set j = 1 (inner loop), i stays 3
    • Set j = 2 (inner loop), i stays 3
    • Inner loop finishes, proceed with outer loop.
  • Outer loop finishes as well (we looped over i in 1:3). Job done.

Nested loops can be used to iterate over matrices or data frames:

mat <- matrix(NA, nrow = 2, ncol = 3)
mat
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]   NA   NA   NA
for (i in 1:nrow(mat)) {
  for (j in 1:ncol(mat)) {
     mat[i,j] <- (i-1)*ncol(mat) + j
     cat(str_c("Entry (", i, ", ", j, ") = ", mat[i,j], "\n"))
  }
}
#> Entry (1, 1) = 1
#> Entry (1, 2) = 2
#> Entry (1, 3) = 3
#> Entry (2, 1) = 4
#> Entry (2, 2) = 5
#> Entry (2, 3) = 6
mat
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]    4    5    6

Often you can replace nested loops with a single loop by using expand_grid:

library(tidyverse)  # load function expand_grid
mat <- matrix(NA, nrow = 2, ncol = 3)
ite <- expand_grid(i = 1:2, j=1:3)
ite
#> # A tibble: 6 × 2
#>       i     j
#>   <int> <int>
#> 1     1     1
#> 2     1     2
#> 3     1     3
#> 4     2     1
#> 5     2     2
#> 6     2     3
for (r in 1:nrow(ite)) { # iterate over rows
   i <- ite$i[r]
   j <- ite$j[r]
   mat[i,j] <- (i-1)*ncol(mat) + j
   cat(str_c("Entry (", i, ", ", j, ") = ", mat[i,j], "\n"))
}
#> Entry (1, 1) = 1
#> Entry (1, 2) = 2
#> Entry (1, 3) = 3
#> Entry (2, 1) = 4
#> Entry (2, 2) = 5
#> Entry (2, 3) = 6
mat
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]    4    5    6

Note expand_grid creates a data frame with all combinations. This way of looping is a more flexible approach since you can

  • nest more loops by adding more columns to ite,
  • add different values in each column.

For instance, if you only want to calculate values for row 2 and columns 1 and 3 the code becomes:

mat <- matrix(NA, nrow = 2, ncol = 3)
ite <- expand_grid(i = 2, j = c(1,3))
ite
#> # A tibble: 2 × 2
#>       i     j
#>   <dbl> <dbl>
#> 1     2     1
#> 2     2     3
for (r in 1:nrow(ite)) { # iterate over rows
   i <- ite$i[r]
   j <- ite$j[r]
   mat[i,j] <- (i-1)*ncol(mat) + j
   cat(str_c("Entry (", i, ", ", j, ") = ", mat[i,j], "\n"))
}
#> Entry (2, 1) = 4
#> Entry (2, 3) = 6
mat
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]    4   NA    6

9.4 Recap

Comparison/relational operators known to R are:

  • < for less than,
  • > for greater than,
  • <= for less than or equal to,
  • >= for greater than or equal to,
  • == for equal to each other (and not = which is typically used for assignment!),
  • != not equal to each other.

Logical operators known to R are:

  • & and,
  • | or,
  • ! not.

If you use && and || only the first element in vectors are compared. In general this is used rarely.

Useful functions that return a logical are any and all which can be used to join logical values in vectors.

Conditional Statements can be constructed using for instance if and while statements. Moreover, function if_else is a vectorized alternative.

Loops can be created using for and while statements.

You can break out of a loop using break and jump to the next iteration (skipping the remainder of the code in the loop) using next.

Do not use a loop when a vectorized alternative exists.

Do not grow objects during the loop. Instead, allocate an object to hold the results and fill it in during the loop.

Nested loops are possible in R. However, often they can be converted into a single loop by defining a data frame having the values of the nested loops in each row. Here function expand_grid may be useful to create the data frame.

You may also have a look at the slides for this module .

9.5 Exercises

Below you will find a set of exercises. Always have a look at the exercises before you meet in your study group and try to solve them yourself. Are you stuck, see the help page. Some of the solutions to each exercise can be seen by pressing the button at each question. Beware, you will not learn by giving up too early. Put some effort into finding a solution! Always practice using shortcuts in RStudio (see Tools > Keyboard Shortcuts Help).

Go to the Tools for Analytics workspace and download/export the TM9 project. Open it on your laptop and have a look at the files in the exercises folder which can be used as a starting point.

9.5.1 Exercise (conditional expressions)

Solve this exercise using a script file

  1. Consider object x:

    x <- c(1,2,-3,4)

    What will this conditional expression return?

    if(all(x>0)){
     print("All Postives")
    } else {
     print("Not all positives")
    }
  2. What will the following expressions return?

    x <- c(TRUE, FALSE, TRUE, TRUE)
    all(x)
    any(x)
    any(!x)
    all(!x)
  3. Which of the expressions above is always FALSE when at least one entry of a logical vector x is TRUE?

Consider vector:

library(tidyverse)
x <- 1:15
x
#>  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  1. Use the if_else function to set elements with value below 7 to 0.
  1. Use the if_else function to set elements with value below 7 or above 10 to NA_integer_ (which is the NA/missing value of an integer).
  1. Consider code

    x <- sample(c(1:10,NA,5.5), 1)
    x
    #> [1] 7

    which generates a number from the vector c(1:10,NA,5.5).

    Write code which set object y equal to “even” if x is even, “odd” if x is odd, “decimal” if x has a decimal not zero and “missing” if x is NA. Hint: have a look at ?'%%' (the modulo operator).

9.5.2 Exercise (loops)

  1. Using a for loop, create a vector having values \(2i + 4\) given \(i=1\ldots 4\).
  1. Using a for loop, create a vector having values \(2i + 4\) given \(i=2,5,6,12\).
  1. Solve Question 2 using a while loop.
  1. Solve Questions 1 and 2 using a vectorized alternative.

9.5.3 Exercise (search vector)

This exercise is a slightly modified version an exam assignment (reexam 2021-A1).

Consider the vector:

v <- c(9, 19, 2, 8, NA, 12, 9, 23, NA, 34)
v
#>  [1]  9 19  2  8 NA 12  9 23 NA 34
  1. Is any of the entries in v below or equal to 2?
  1. Is all of the entries in v above or equal to 2?
  1. Does v have missing values?
  1. Which entries in v are above 10? You must return the indices, e.g. the index of v[3] is 3.
  1. Create a vector res where res[i] is equal to v[i] if v[i] is less than 10 and otherwise zero (also if v[i] is NA).

9.5.4 Exercise (calculating distances)

Consider zip codes in Jutland:

# remotes::install_github("bss-osca/tfa-package", upgrade = FALSE)  # run to upgrade
library(tidyverse)
data(zips, package = "tfa")  # load the zips data from the tfa package
zips
#>      postal_code           place_name latitude longitude
#> 1           1050          København K     55.7     12.59
#> 2           1051          København K     55.7     12.59
#> 3           1052          København K     55.7     12.59
#> 4           1053          København K     55.7     12.59
#> 5           1054          København K     55.7     12.59
#> 6           1055          København K     55.7     12.59
#> 7           1056          København K     55.7     12.59
#> 8           1057          København K     55.7     12.59
#> 9           1058          København K     55.7     12.59
#> 10          1059          København K     55.7     12.59
#> 11          1060          København K     55.7     12.59
#> 12          1061          København K     55.7     12.58
#> 13          1062          København K     55.7     12.58
#> 14          1063          København K     55.7     12.58
#> 15          1064          København K     55.7     12.58
#> 16          1065          København K     55.7     12.58
#> 17          1066          København K     55.7     12.58
#> 18          1067          København K     55.7     12.58
#> 19          1068          København K     55.7     12.58
#> 20          1069          København K     55.7     12.58
#> 21          1070          København K     55.7     12.58
#> 22          1071          København K     55.7     12.58
#> 23          1072          København K     55.7     12.58
#> 24          1073          København K     55.7     12.58
#> 25          1074          København K     55.7     12.58
#> 26          1100          København K     55.7     12.58
#> 27          1101          København K     55.7     12.58
#> 28          1102          København K     55.7     12.58
#> 29          1103          København K     55.7     12.58
#> 30          1104          København K     55.7     12.58
#> 31          1105          København K     55.7     12.58
#> 32          1106          København K     55.7     12.58
#> 33          1107          København K     55.7     12.58
#> 34          1110          København K     55.7     12.58
#> 35          1111          København K     55.7     12.58
#> 36          1112          København K     55.7     12.58
#> 37          1113          København K     55.7     12.58
#> 38          1114          København K     55.7     12.58
#> 39          1115          København K     55.7     12.58
#> 40          1116          København K     55.7     12.58
#> 41          1117          København K     55.7     12.58
#> 42          1118          København K     55.7     12.58
#> 43          1119          København K     55.7     12.58
#> 44          1120          København K     55.7     12.58
#> 45          1121          København K     55.7     12.58
#> 46          1122          København K     55.7     12.58
#> 47          1123          København K     55.7     12.58
#> 48          1124          København K     55.7     12.58
#> 49          1125          København K     55.7     12.58
#> 50          1126          København K     55.7     12.58
#> 51          1127          København K     55.7     12.58
#> 52          1128          København K     55.7     12.57
#> 53          1129          København K     55.7     12.57
#> 54          1130          København K     55.7     12.57
#> 55          1131          København K     55.7     12.57
#> 56          1150          København K     55.7     12.58
#> 57          1151          København K     55.7     12.58
#> 58          1152          København K     55.7     12.58
#> 59          1153          København K     55.7     12.58
#> 60          1154          København K     55.7     12.58
#> 61          1155          København K     55.7     12.58
#> 62          1156          København K     55.7     12.58
#> 63          1157          København K     55.7     12.58
#> 64          1158          København K     55.7     12.57
#> 65          1159          København K     55.7     12.57
#> 66          1160          København K     55.7     12.58
#> 67          1161          København K     55.7     12.57
#> 68          1162          København K     55.7     12.57
#> 69          1164          København K     55.7     12.57
#> 70          1165          København K     55.7     12.57
#> 71          1166          København K     55.7     12.57
#> 72          1167          København K     55.7     12.57
#> 73          1168          København K     55.7     12.57
#> 74          1169          København K     55.7     12.57
#> 75          1170          København K     55.7     12.57
#> 76          1171          København K     55.7     12.57
#> 77          1172          København K     55.7     12.57
#> 78          1173          København K     55.7     12.57
#> 79          1174          København K     55.7     12.57
#> 80          1175          København K     55.7     12.57
#> 81          1200          København K     55.7     12.58
#> 82          1201          København K     55.7     12.58
#> 83          1202          København K     55.7     12.58
#> 84          1203          København K     55.7     12.58
#> 85          1204          København K     55.7     12.58
#> 86          1205          København K     55.7     12.58
#> 87          1206          København K     55.7     12.58
#> 88          1207          København K     55.7     12.58
#> 89          1208          København K     55.7     12.58
#> 90          1209          København K     55.7     12.58
#> 91          1210          København K     55.7     12.57
#> 92          1211          København K     55.7     12.57
#> 93          1212          København K     55.7     12.58
#> 94          1213          København K     55.7     12.58
#> 95          1214          København K     55.7     12.58
#> 96          1215          København K     55.7     12.58
#> 97          1216          København K     55.7     12.58
#> 98          1218          København K     55.7     12.58
#> 99          1219          København K     55.7     12.58
#> 100         1220          København K     55.7     12.58
#> 101         1221          København K     55.7     12.58
#> 102         1250          København K     55.7     12.59
#> 103         1251          København K     55.7     12.59
#> 104         1252          København K     55.7     12.60
#> 105         1253          København K     55.7     12.59
#> 106         1254          København K     55.7     12.59
#> 107         1255          København K     55.7     12.59
#> 108         1256          København K     55.7     12.59
#> 109         1257          København K     55.7     12.59
#> 110         1259          København K     55.7     12.60
#> 111         1260          København K     55.7     12.59
#> 112         1261          København K     55.7     12.59
#> 113         1263          København K     55.7     12.59
#> 114         1264          København K     55.7     12.59
#> 115         1265          København K     55.7     12.59
#> 116         1266          København K     55.7     12.59
#> 117         1267          København K     55.7     12.59
#> 118         1268          København K     55.7     12.59
#> 119         1270          København K     55.7     12.59
#> 120         1271          København K     55.7     12.59
#> 121         1300          København K     55.7     12.59
#> 122         1301          København K     55.7     12.59
#> 123         1302          København K     55.7     12.59
#> 124         1303          København K     55.7     12.59
#> 125         1304          København K     55.7     12.58
#> 126         1306          København K     55.7     12.58
#> 127         1307          København K     55.7     12.58
#> 128         1308          København K     55.7     12.58
#> 129         1309          København K     55.7     12.58
#> 130         1310          København K     55.7     12.59
#> 131         1311          København K     55.7     12.59
#> 132         1312          København K     55.7     12.59
#> 133         1313          København K     55.7     12.59
#> 134         1314          København K     55.7     12.59
#> 135         1315          København K     55.7     12.59
#> 136         1316          København K     55.7     12.58
#> 137         1317          København K     55.7     12.58
#> 138         1318          København K     55.7     12.58
#> 139         1319          København K     55.7     12.59
#> 140         1320          København K     55.7     12.59
#> 141         1321          København K     55.7     12.59
#> 142         1322          København K     55.7     12.59
#> 143         1323          København K     55.7     12.59
#> 144         1324          København K     55.7     12.59
#> 145         1325          København K     55.7     12.59
#> 146         1326          København K     55.7     12.59
#> 147         1327          København K     55.7     12.59
#> 148         1328          København K     55.7     12.59
#> 149         1329          København K     55.7     12.59
#> 150         1350          København K     55.7     12.58
#> 151         1352          København K     55.7     12.57
#> 152         1353          København K     55.7     12.57
#> 153         1354          København K     55.7     12.57
#> 154         1355          København K     55.7     12.57
#> 155         1356          København K     55.7     12.57
#> 156         1357          København K     55.7     12.57
#> 157         1358          København K     55.7     12.57
#> 158         1359          København K     55.7     12.57
#> 159         1360          København K     55.7     12.57
#> 160         1361          København K     55.7     12.57
#> 161         1362          København K     55.7     12.57
#> 162         1363          København K     55.7     12.57
#> 163         1364          København K     55.7     12.57
#> 164         1365          København K     55.7     12.56
#> 165         1366          København K     55.7     12.56
#> 166         1367          København K     55.7     12.56
#> 167         1368          København K     55.7     12.56
#> 168         1369          København K     55.7     12.56
#> 169         1370          København K     55.7     12.56
#> 170         1371          København K     55.7     12.57
#> 171         1400          København K     55.7     12.59
#> 172         1401          København K     55.7     12.59
#> 173         1402          København K     55.7     12.59
#> 174         1403          København K     55.7     12.59
#> 175         1406          København K     55.7     12.59
#> 176         1407          København K     55.7     12.59
#> 177         1408          København K     55.7     12.59
#> 178         1409          København K     55.7     12.59
#> 179         1410          København K     55.7     12.59
#> 180         1411          København K     55.7     12.58
#> 181         1412          København K     55.7     12.59
#> 182         1413          København K     55.7     12.59
#> 183         1414          København K     55.7     12.59
#> 184         1415          København K     55.7     12.59
#> 185         1416          København K     55.7     12.59
#> 186         1417          København K     55.7     12.59
#> 187         1418          København K     55.7     12.59
#> 188         1419          København K     55.7     12.59
#> 189         1420          København K     55.7     12.59
#> 190         1421          København K     55.7     12.59
#> 191         1422          København K     55.7     12.60
#> 192         1423          København K     55.7     12.59
#> 193         1424          København K     55.7     12.59
#> 194         1425          København K     55.7     12.59
#> 195         1426          København K     55.7     12.60
#> 196         1427          København K     55.7     12.60
#> 197         1428          København K     55.7     12.60
#> 198         1429          København K     55.7     12.60
#> 199         1430          København K     55.7     12.60
#> 200         1432          København K     55.7     12.61
#> 201         1433          København K     55.7     12.70
#> 202         1434          København K     55.7     12.60
#> 203         1435          København K     55.7     12.61
#> 204         1436          København K     55.7     12.60
#> 205         1437          København K     55.7     12.60
#> 206         1438          København K     55.7     12.60
#> 207         1439          København K     55.7     12.61
#> 208         1440          København K     55.7     12.60
#> 209         1441          København K     55.7     12.61
#> 210         1450          København K     55.7     12.57
#> 211         1451          København K     55.7     12.57
#> 212         1452          København K     55.7     12.57
#> 213         1453          København K     55.7     12.57
#> 214         1454          København K     55.7     12.57
#> 215         1455          København K     55.7     12.57
#> 216         1456          København K     55.7     12.57
#> 217         1457          København K     55.7     12.57
#> 218         1458          København K     55.7     12.57
#> 219         1459          København K     55.7     12.57
#> 220         1460          København K     55.7     12.57
#> 221         1461          København K     55.7     12.57
#> 222         1462          København K     55.7     12.57
#> 223         1463          København K     55.7     12.57
#> 224         1464          København K     55.7     12.57
#> 225         1465          København K     55.7     12.57
#> 226         1466          København K     55.7     12.57
#> 227         1467          København K     55.7     12.57
#> 228         1468          København K     55.7     12.57
#> 229         1470          København K     55.7     12.57
#> 230         1471          København K     55.7     12.58
#> 231         1472          København K     55.7     12.58
#> 232         1473          København K     55.7     12.58
#> 233         1550          København V     55.7     12.57
#> 234         1551          København V     55.7     12.57
#> 235         1552          København V     55.7     12.57
#> 236         1553          København V     55.7     12.57
#> 237         1554          København V     55.7     12.57
#> 238         1555          København V     55.7     12.57
#> 239         1556          København V     55.7     12.57
#> 240         1557          København V     55.7     12.57
#> 241         1558          København V     55.7     12.58
#> 242         1559          København V     55.7     12.58
#> 243         1560          København V     55.7     12.57
#> 244         1561          København V     55.7     12.56
#> 245         1562          København V     55.7     12.57
#> 246         1563          København V     55.7     12.57
#> 247         1564          København V     55.7     12.58
#> 248         1567          København V     55.7     12.57
#> 249         1568          København V     55.7     12.57
#> 250         1569          København V     55.7     12.57
#> 251         1570          København V     55.7     12.56
#> 252         1571          København V     55.7     12.57
#> 253         1572          København V     55.7     12.57
#> 254         1573          København V     55.7     12.57
#> 255         1574          København V     55.7     12.57
#> 256         1575          København V     55.7     12.57
#> 257         1576          København V     55.7     12.57
#> 258         1577          København V     55.7     12.57
#> 259         1600          København V     55.7     12.56
#> 260         1601          København V     55.7     12.56
#> 261         1602          København V     55.7     12.56
#> 262         1603          København V     55.7     12.56
#> 263         1604          København V     55.7     12.56
#> 264         1605          København V     55.7     12.56
#> 265         1606          København V     55.7     12.56
#> 266         1607          København V     55.7     12.56
#> 267         1608          København V     55.7     12.57
#> 268         1609          København V     55.7     12.56
#> 269         1610          København V     55.7     12.55
#> 270         1611          København V     55.7     12.56
#> 271         1612          København V     55.7     12.56
#> 272         1613          København V     55.7     12.56
#> 273         1614          København V     55.7     12.56
#> 274         1615          København V     55.7     12.56
#> 275         1616          København V     55.7     12.56
#> 276         1617          København V     55.7     12.55
#> 277         1618          København V     55.7     12.55
#> 278         1619          København V     55.7     12.55
#> 279         1620          København V     55.7     12.55
#> 280         1621          København V     55.7     12.55
#> 281         1622          København V     55.7     12.55
#> 282         1623          København V     55.7     12.55
#> 283         1624          København V     55.7     12.55
#> 284         1631          København V     55.7     12.56
#> 285         1632          København V     55.7     12.55
#> 286         1633          København V     55.7     12.56
#> 287         1634          København V     55.7     12.56
#> 288         1635          København V     55.7     12.56
#> 289         1650          København V     55.7     12.55
#> 290         1651          København V     55.7     12.56
#> 291         1652          København V     55.7     12.56
#> 292         1653          København V     55.7     12.56
#> 293         1654          København V     55.7     12.56
#> 294         1655          København V     55.7     12.56
#> 295         1656          København V     55.7     12.56
#> 296         1657          København V     55.7     12.56
#> 297         1658          København V     55.7     12.55
#> 298         1659          København V     55.7     12.55
#> 299         1660          København V     55.7     12.55
#> 300         1661          København V     55.7     12.55
#> 301         1662          København V     55.7     12.55
#> 302         1663          København V     55.7     12.55
#> 303         1664          København V     55.7     12.55
#> 304         1665          København V     55.7     12.55
#> 305         1666          København V     55.7     12.55
#> 306         1667          København V     55.7     12.55
#> 307         1668          København V     55.7     12.55
#> 308         1669          København V     55.7     12.55
#> 309         1670          København V     55.7     12.55
#> 310         1671          København V     55.7     12.55
#> 311         1672          København V     55.7     12.55
#> 312         1673          København V     55.7     12.55
#> 313         1674          København V     55.7     12.54
#> 314         1675          København V     55.7     12.55
#> 315         1676          København V     55.7     12.55
#> 316         1677          København V     55.7     12.55
#> 317         1699          København V     55.7     12.56
#> 318         1700          København V     55.7     12.56
#> 319         1701          København V     55.7     12.56
#> 320         1702          København V     55.7     12.56
#> 321         1703          København V     55.7     12.56
#> 322         1704          København V     55.7     12.57
#> 323         1705          København V     55.7     12.55
#> 324         1706          København V     55.7     12.56
#> 325         1707          København V     55.7     12.56
#> 326         1708          København V     55.7     12.56
#> 327         1709          København V     55.7     12.55
#> 328         1710          København V     55.7     12.56
#> 329         1711          København V     55.7     12.56
#> 330         1712          København V     55.7     12.56
#> 331         1714          København V     55.7     12.56
#> 332         1715          København V     55.7     12.56
#> 333         1716          København V     55.7     12.56
#> 334         1717          København V     55.7     12.56
#> 335         1718          København V     55.7     12.56
#> 336         1719          København V     55.7     12.56
#> 337         1720          København V     55.7     12.55
#> 338         1721          København V     55.7     12.55
#> 339         1722          København V     55.7     12.55
#> 340         1723          København V     55.7     12.55
#> 341         1724          København V     55.7     12.55
#> 342         1725          København V     55.7     12.55
#> 343         1726          København V     55.7     12.55
#> 344         1727          København V     55.7     12.55
#> 345         1728          København V     55.7     12.55
#> 346         1729          København V     55.7     12.55
#> 347         1730          København V     55.7     12.55
#> 348         1731          København V     55.7     12.55
#> 349         1732          København V     55.7     12.55
#> 350         1733          København V     55.7     12.54
#> 351         1734          København V     55.7     12.55
#> 352         1735          København V     55.7     12.55
#> 353         1736          København V     55.7     12.54
#> 354         1737          København V     55.7     12.54
#> 355         1738          København V     55.7     12.54
#> 356         1739          København V     55.7     12.54
#> 357         1749          København V     55.7     12.54
#> 358         1750          København V     55.7     12.54
#> 359         1751          København V     55.7     12.54
#> 360         1752          København V     55.7     12.54
#> 361         1753          København V     55.7     12.54
#> 362         1754          København V     55.7     12.54
#> 363         1755          København V     55.7     12.54
#> 364         1756          København V     55.7     12.54
#> 365         1757          København V     55.7     12.54
#> 366         1758          København V     55.7     12.54
#> 367         1759          København V     55.7     12.54
#> 368         1760          København V     55.7     12.54
#> 369         1761          København V     55.7     12.54
#> 370         1762          København V     55.7     12.54
#> 371         1763          København V     55.7     12.54
#> 372         1764          København V     55.7     12.54
#> 373         1765          København V     55.7     12.54
#> 374         1766          København V     55.7     12.54
#> 375         1770          København V     55.7     12.54
#> 376         1771          København V     55.7     12.54
#> 377         1772          København V     55.7     12.54
#> 378         1773          København V     55.7     12.54
#> 379         1774          København V     55.7     12.54
#> 380         1775          København V     55.7     12.54
#> 381         1777          København V     55.7     12.54
#> 382         1799          København V     55.7     12.53
#> 383         2100          København Ø     55.7     12.57
#> 384         2150             Nordhavn     55.7     12.60
#> 385         2200          København N     55.7     12.55
#> 386         2300          København S     55.7     12.60
#> 387         2400         København NV     55.7     12.53
#> 388         2450         København SV     55.6     12.54
#> 389         2500                Valby     55.7     12.50
#> 390         2700             Brønshøj     55.7     12.48
#> 391         2720              Vanløse     55.7     12.49
#> 392         1800      Frederiksberg C     55.7     12.53
#> 393         1801      Frederiksberg C     55.7     12.53
#> 394         1802      Frederiksberg C     55.7     12.53
#> 395         1803      Frederiksberg C     55.7     12.53
#> 396         1804      Frederiksberg C     55.7     12.53
#> 397         1805      Frederiksberg C     55.7     12.53
#> 398         1806      Frederiksberg C     55.7     12.53
#> 399         1807      Frederiksberg C     55.7     12.53
#> 400         1808      Frederiksberg C     55.7     12.53
#> 401         1809      Frederiksberg C     55.7     12.54
#> 402         1810      Frederiksberg C     55.7     12.54
#> 403         1811      Frederiksberg C     55.7     12.54
#> 404         1812      Frederiksberg C     55.7     12.54
#> 405         1813      Frederiksberg C     55.7     12.54
#> 406         1814      Frederiksberg C     55.7     12.54
#> 407         1815      Frederiksberg C     55.7     12.54
#> 408         1816      Frederiksberg C     55.7     12.54
#> 409         1817      Frederiksberg C     55.7     12.54
#> 410         1818      Frederiksberg C     55.7     12.54
#> 411         1819      Frederiksberg C     55.7     12.55
#> 412         1820      Frederiksberg C     55.7     12.54
#> 413         1822      Frederiksberg C     55.7     12.55
#> 414         1823      Frederiksberg C     55.7     12.55
#> 415         1824      Frederiksberg C     55.7     12.55
#> 416         1825      Frederiksberg C     55.7     12.55
#> 417         1826      Frederiksberg C     55.7     12.54
#> 418         1827      Frederiksberg C     55.7     12.54
#> 419         1828      Frederiksberg C     55.7     12.54
#> 420         1829      Frederiksberg C     55.7     12.54
#> 421         1850      Frederiksberg C     55.7     12.54
#> 422         1851      Frederiksberg C     55.7     12.54
#> 423         1852      Frederiksberg C     55.7     12.54
#> 424         1853      Frederiksberg C     55.7     12.54
#> 425         1854      Frederiksberg C     55.7     12.53
#> 426         1855      Frederiksberg C     55.7     12.54
#> 427         1856      Frederiksberg C     55.7     12.54
#> 428         1857      Frederiksberg C     55.7     12.54
#> 429         1860      Frederiksberg C     55.7     12.54
#> 430         1861      Frederiksberg C     55.7     12.54
#> 431         1862      Frederiksberg C     55.7     12.54
#> 432         1863      Frederiksberg C     55.7     12.54
#> 433         1864      Frederiksberg C     55.7     12.54
#> 434         1865      Frederiksberg C     55.7     12.54
#> 435         1866      Frederiksberg C     55.7     12.54
#> 436         1867      Frederiksberg C     55.7     12.54
#> 437         1868      Frederiksberg C     55.7     12.54
#> 438         1870      Frederiksberg C     55.7     12.54
#> 439         1871      Frederiksberg C     55.7     12.54
#> 440         1872      Frederiksberg C     55.7     12.55
#> 441         1873      Frederiksberg C     55.7     12.54
#> 442         1874      Frederiksberg C     55.7     12.55
#> 443         1875      Frederiksberg C     55.7     12.55
#> 444         1876      Frederiksberg C     55.7     12.54
#> 445         1877      Frederiksberg C     55.7     12.54
#> 446         1878      Frederiksberg C     55.7     12.54
#> 447         1879      Frederiksberg C     55.7     12.55
#> 448         1900      Frederiksberg C     55.7     12.55
#> 449         1901      Frederiksberg C     55.7     12.55
#> 450         1902      Frederiksberg C     55.7     12.55
#> 451         1903      Frederiksberg C     55.7     12.55
#> 452         1904      Frederiksberg C     55.7     12.55
#> 453         1905      Frederiksberg C     55.7     12.55
#> 454         1906      Frederiksberg C     55.7     12.55
#> 455         1908      Frederiksberg C     55.7     12.55
#> 456         1909      Frederiksberg C     55.7     12.55
#> 457         1910      Frederiksberg C     55.7     12.55
#> 458         1911      Frederiksberg C     55.7     12.55
#> 459         1912      Frederiksberg C     55.7     12.55
#> 460         1913      Frederiksberg C     55.7     12.55
#> 461         1914      Frederiksberg C     55.7     12.55
#> 462         1915      Frederiksberg C     55.7     12.55
#> 463         1916      Frederiksberg C     55.7     12.56
#> 464         1917      Frederiksberg C     55.7     12.56
#> 465         1920      Frederiksberg C     55.7     12.55
#> 466         1921      Frederiksberg C     55.7     12.55
#> 467         1922      Frederiksberg C     55.7     12.55
#> 468         1923      Frederiksberg C     55.7     12.55
#> 469         1924      Frederiksberg C     55.7     12.55
#> 470         1925      Frederiksberg C     55.7     12.55
#> 471         1926      Frederiksberg C     55.7     12.56
#> 472         1927      Frederiksberg C     55.7     12.56
#> 473         1928      Frederiksberg C     55.7     12.56
#> 474         1950      Frederiksberg C     55.7     12.54
#> 475         1951      Frederiksberg C     55.7     12.54
#> 476         1952      Frederiksberg C     55.7     12.54
#> 477         1953      Frederiksberg C     55.7     12.54
#> 478         1954      Frederiksberg C     55.7     12.54
#> 479         1955      Frederiksberg C     55.7     12.54
#> 480         1956      Frederiksberg C     55.7     12.54
#> 481         1957      Frederiksberg C     55.7     12.54
#> 482         1958      Frederiksberg C     55.7     12.54
#> 483         1959      Frederiksberg C     55.7     12.54
#> 484         1960      Frederiksberg C     55.7     12.55
#> 485         1961      Frederiksberg C     55.7     12.55
#> 486         1962      Frederiksberg C     55.7     12.55
#> 487         1963      Frederiksberg C     55.7     12.55
#> 488         1964      Frederiksberg C     55.7     12.55
#> 489         1965      Frederiksberg C     55.7     12.55
#> 490         1966      Frederiksberg C     55.7     12.55
#> 491         1967      Frederiksberg C     55.7     12.55
#> 492         1970      Frederiksberg C     55.7     12.55
#> 493         1971      Frederiksberg C     55.7     12.55
#> 494         1972      Frederiksberg C     55.7     12.55
#> 495         1973      Frederiksberg C     55.7     12.55
#> 496         1974      Frederiksberg C     55.7     12.55
#> 497         2000        Frederiksberg     55.7     12.52
#> 498         2740            Skovlunde     55.7     12.40
#> 499         2750             Ballerup     55.7     12.36
#> 500         2760                Måløv     55.8     12.32
#> 501         2605              Brøndby     55.7     12.41
#> 502         2660       Brøndby Strand     55.6     12.42
#> 503         2791               Dragør     55.6     12.65
#> 504         2820             Gentofte     55.8     12.53
#> 505         2870            Dyssegård     55.7     12.53
#> 506         2900             Hellerup     55.7     12.56
#> 507         2920       Charlottenlund     55.8     12.57
#> 508         2930          Klampenborg     55.8     12.59
#> 509         2860               Søborg     55.7     12.48
#> 510         2880             Bagsværd     55.8     12.46
#> 511         2600             Glostrup     55.7     12.40
#> 512         2730               Herlev     55.7     12.43
#> 513         2620          Albertslund     55.7     12.35
#> 514         2650             Hvidovre     55.6     12.47
#> 515         2630             Taastrup     55.6     12.29
#> 516         2640           Hedehusene     55.7     12.20
#> 517         2800       Kongens Lyngby     55.8     12.51
#> 518         2830                Virum     55.8     12.47
#> 519         2610              Rødovre     55.7     12.45
#> 520         2635                Ishøj     55.6     12.34
#> 521         2770              Kastrup     55.6     12.61
#> 522         2625           Vallensbæk     55.6     12.36
#> 523         2665    Vallensbæk Strand     55.6     12.39
#> 524         3500              Værløse     55.8     12.36
#> 525         3520                Farum     55.8     12.37
#> 526         3450              Allerød     55.9     12.35
#> 527         3540                Lynge     55.8     12.28
#> 528         2980             Kokkedal     55.9     12.49
#> 529         2990                 Nivå     55.9     12.50
#> 530         3050             Humlebæk     56.0     12.52
#> 531         3480          Fredensborg     56.0     12.41
#> 532         3000            Helsingør     56.0     12.59
#> 533         3060           Espergærde     56.0     12.54
#> 534         3070          Snekkersten     56.0     12.58
#> 535         3080                Tikøb     56.0     12.45
#> 536         3100              Hornbæk     56.1     12.45
#> 537         3140             Ålsgårde     56.1     12.53
#> 538         3150             Hellebæk     56.1     12.56
#> 539         3490            Kvistgård     56.0     12.50
#> 540         3320             Skævinge     55.9     12.15
#> 541         3330              Gørløse     55.9     12.20
#> 542         3400             Hillerød     55.9     12.29
#> 543         2960        Rungsted Kyst     55.9     12.53
#> 544         2970             Hørsholm     55.9     12.50
#> 545         2840                Holte     55.8     12.49
#> 546         2850                Nærum     55.8     12.53
#> 547         2942            Skodsborg     55.8     12.57
#> 548         2950               Vedbæk     55.8     12.55
#> 549         3460             Birkerød     55.8     12.43
#> 550         2765               Smørum     55.7     12.30
#> 551         3650             Ølstykke     55.8     12.16
#> 552         3660             Stenløse     55.8     12.22
#> 553         3670       Veksø Sjælland     55.8     12.24
#> 554         3550            Slangerup     55.8     12.17
#> 555         3600        Frederikssund     55.8     12.07
#> 556         3630           Jægerspris     55.9     11.96
#> 557         4050               Skibby     55.8     11.96
#> 558         3300        Frederiksværk     56.0     12.02
#> 559         3310               Ølsted     55.9     12.06
#> 560         3360             Liseleje     56.0     11.97
#> 561         3370                Melby     56.0     11.97
#> 562         3390            Hundested     56.0     11.88
#> 563         3120        Dronningmølle     56.1     12.38
#> 564         3200             Helsinge     56.0     12.18
#> 565         3210                Vejby     56.1     12.14
#> 566         3220         Tisvildeleje     56.1     12.09
#> 567         3230              Græsted     56.1     12.26
#> 568         3250            Gilleleje     56.1     12.29
#> 569         3700                Rønne     55.1     14.72
#> 570         3720            Aakirkeby     55.1     14.93
#> 571         3730                 Nexø     55.0     15.11
#> 572         3740              Svaneke     55.1     15.13
#> 573         3751           Østermarie     55.1     15.02
#> 574         3760              Gudhjem     55.2     14.95
#> 575         3770              Allinge     55.3     14.80
#> 576         3782           Klemensker     55.2     14.81
#> 577         3790                Hasle     55.2     14.72
#> 578         8700              Horsens     55.9      9.85
#> 579         8732            Hovedgård     55.9      9.96
#> 580         8740            Brædstrup     56.0      9.62
#> 581         8751               Gedved     55.9      9.85
#> 582         8752              Østbirk     56.0      9.75
#> 583         8789             Endelave     55.8     10.28
#> 584         6933                Kibæk     56.0      8.87
#> 585         6973               Ørnhøj     56.2      8.57
#> 586         7270             Stakroge     55.9      8.85
#> 587         7280       Sønder Felding     55.9      8.78
#> 588         7400              Herning     56.1      8.97
#> 589         7451                Sunds     56.2      9.02
#> 590         7480            Vildbjerg     56.2      8.77
#> 591         7490                Aulum     56.3      8.80
#> 592         7540              Haderup     56.4      8.97
#> 593         7550               Sørvad     56.3      8.66
#> 594         6990              Ulfborg     56.3      8.22
#> 595         7500            Holstebro     56.4      8.63
#> 596         7570                 Vemb     56.3      8.36
#> 597         7830             Vinderup     56.5      8.80
#> 598         7620               Lemvig     56.5      8.29
#> 599         7650         Bøvlingbjerg     56.4      8.21
#> 600         7660          Bækmarksbro     56.4      8.32
#> 601         7673             Harboøre     56.6      8.16
#> 602         7680             Thyborøn     56.7      8.21
#> 603         7560                Hjerm     56.4      8.65
#> 604         7600               Struer     56.5      8.57
#> 605         7790              Thyholm     56.6      8.55
#> 606         8400             Ebeltoft     56.2     10.67
#> 607         8410                Rønde     56.3     10.47
#> 608         8420               Knebel     56.2     10.47
#> 609         8444                Balle     56.3     10.79
#> 610         8543             Hornslet     56.3     10.31
#> 611         8544                Mørke     56.4     10.34
#> 612         8550             Ryomgård     56.4     10.48
#> 613         8560               Kolind     56.4     10.59
#> 614         8581             Nimtofte     56.4     10.58
#> 615         8500               Grenaa     56.4     10.87
#> 616         8570             Trustrup     56.4     10.76
#> 617         8585             Glesborg     56.5     10.67
#> 618         8586           Ørum Djurs     56.4     10.66
#> 619         8592               Anholt     56.7     11.54
#> 620         8950               Ørsted     56.5     10.33
#> 621         8961           Allingåbro     56.5     10.42
#> 622         8963               Auning     56.4     10.38
#> 623         8370              Hadsten     56.3     10.07
#> 624         8382             Hinnerup     56.3     10.07
#> 625         8450               Hammel     56.3      9.87
#> 626         8472               Sporup     56.2      9.83
#> 627         8860              Ulstrup     56.4      9.79
#> 628         8881               Thorsø     56.3      9.79
#> 629         8300                Odder     56.0     10.18
#> 630         8350            Hundslund     55.9     10.06
#> 631         8799                 Tunø     56.0     10.44
#> 632         8870                Langå     56.4      9.92
#> 633         8900            Randers C     56.5     10.03
#> 634         8920           Randers NV     56.5      9.98
#> 635         8930           Randers NØ     56.5     10.08
#> 636         8940           Randers SV     56.4     10.03
#> 637         8960           Randers SØ     56.4     10.11
#> 638         8970              Havndal     56.6     10.23
#> 639         8981             Spentrup     56.5     10.04
#> 640         8983            Gjerlev J     56.6     10.14
#> 641         8990                Fårup     56.5      9.88
#> 642         8600            Silkeborg     56.2      9.56
#> 643         8620            Kjellerup     56.3      9.41
#> 644         8632              Lemming     56.2      9.54
#> 645         8641              Sorring     56.2      9.78
#> 646         8643               Ans By     56.3      9.60
#> 647         8653                 Them     56.1      9.55
#> 648         8654               Bryrup     56.0      9.52
#> 649         8882              Fårvang     56.3      9.71
#> 650         8883                Gjern     56.2      9.74
#> 651         8305                Samsø     55.9     10.59
#> 652         8362              Hørning     56.1     10.03
#> 653         8464               Galten     56.2      9.93
#> 654         8660          Skanderborg     56.0      9.93
#> 655         8670                Låsby     56.2      9.81
#> 656         8680                   Ry     56.1      9.76
#> 657         8000             Aarhus C     56.2     10.20
#> 658         8200             Aarhus N     56.2     10.19
#> 659         8210             Aarhus V     56.2     10.16
#> 660         8220             Brabrand     56.2     10.11
#> 661         8230               Åbyhøj     56.2     10.16
#> 662         8240              Risskov     56.2     10.23
#> 663         8250                  Egå     56.2     10.29
#> 664         8260               Viby J     56.1     10.14
#> 665         8270             Højbjerg     56.1     10.19
#> 666         8310          Tranbjerg J     56.1     10.13
#> 667         8320              Mårslet     56.1     10.16
#> 668         8330                Beder     56.1     10.22
#> 669         8340              Malling     56.0     10.21
#> 670         8355             Solbjerg     56.0     10.09
#> 671         8361           Hasselager     56.1     10.09
#> 672         8380                Trige     56.3     10.15
#> 673         8381                Tilst     56.2     10.11
#> 674         8462             Harlev J     56.1     10.00
#> 675         8471                Sabro     56.2     10.04
#> 676         8520              Lystrup     56.2     10.23
#> 677         8530            Hjortshøj     56.3     10.25
#> 678         8541            Skødstrup     56.3     10.31
#> 679         7330               Brande     55.9      9.11
#> 680         7361          Ejstrupholm     56.0      9.29
#> 681         7362               Hampen     56.0      9.36
#> 682         7430                Ikast     56.1      9.16
#> 683         7441              Bording     56.2      9.27
#> 684         7442            Engesvang     56.2      9.34
#> 685         8765             Klovborg     55.9      9.49
#> 686         8766          Nørre Snede     56.0      9.40
#> 687         6880                 Tarm     55.9      8.51
#> 688         6893               Hemmet     55.8      8.31
#> 689         6900               Skjern     56.0      8.50
#> 690         6920              Videbæk     56.1      8.66
#> 691         6940               Lem St     56.0      8.39
#> 692         6950           Ringkøbing     56.1      8.21
#> 693         6960          Hvide Sande     56.0      8.14
#> 694         6971               Spjald     56.1      8.50
#> 695         6980                  Tim     56.2      8.29
#> 696         7130           Juelsminde     55.8     10.00
#> 697         7140               Stouby     55.7      9.80
#> 698         7150               Barrit     55.7      9.89
#> 699         7160              Tørring     55.9      9.50
#> 700         7171                Uldum     55.8      9.59
#> 701         8721              Daugård     55.7      9.71
#> 702         8722            Hedensted     55.8      9.70
#> 703         8723              Løsning     55.8      9.70
#> 704         8762             Flemming     55.9      9.66
#> 705         8763           Rask Mølle     55.9      9.61
#> 706         8781            Stenderup     55.8      9.81
#> 707         8783             Hornsyld     55.8      9.85
#> 708         7800                Skive     56.6      9.02
#> 709         7840              Højslev     56.6      9.17
#> 710         7860             Spøttrup     56.6      8.82
#> 711         7870               Roslev     56.7      8.99
#> 712         7884                  Fur     56.8      9.02
#> 713         7470              Karup J     56.3      9.20
#> 714         7850         Stoholm Jyll     56.5      9.14
#> 715         8800               Viborg     56.4      9.39
#> 716         8830                Tjele     56.5      9.61
#> 717         8831             Løgstrup     56.5      9.32
#> 718         8832                Skals     56.6      9.37
#> 719         8840           Rødkærsbro     56.4      9.51
#> 720         8850          Bjerringbro     56.4      9.65
#> 721         9632              Møldrup     56.6      9.50
#> 722         7900           Nykøbing M     56.8      8.83
#> 723         7950               Erslev     56.8      8.71
#> 724         7960                Karby     56.8      8.58
#> 725         7970            Redsted M     56.7      8.65
#> 726         7980                 Vils     56.8      8.73
#> 727         7990         Øster Assels     56.7      8.72
#> 728         7700              Thisted     57.0      8.63
#> 729         7730            Hanstholm     57.1      8.64
#> 730         7741             Frøstrup     57.1      8.98
#> 731         7742               Vesløs     57.0      8.97
#> 732         7752             Snedsted     56.9      8.50
#> 733         7755          Bedsted Thy     56.8      8.40
#> 734         7760            Hurup Thy     56.7      8.41
#> 735         7770            Vestervig     56.8      8.28
#> 736         9320            Hjallerup     57.2     10.15
#> 737         9330         Dronninglund     57.2     10.30
#> 738         9340                 Asaa     57.1     10.39
#> 739         9700          Brønderslev     57.3      9.95
#> 740         9740            Jerslev J     57.3     10.11
#> 741         9300                 Sæby     57.3     10.50
#> 742         9352               Dybvad     57.3     10.33
#> 743         9750             Østervrå     57.3     10.26
#> 744         9900        Frederikshavn     57.4     10.50
#> 745         9970             Strandby     57.5     10.49
#> 746         9981                Jerup     57.5     10.44
#> 747         9982                Ålbæk     57.6     10.40
#> 748         9990               Skagen     57.7     10.56
#> 749         9600                 Aars     56.8      9.50
#> 750         9620            Aalestrup     56.7      9.49
#> 751         9631              Gedsted     56.7      9.34
#> 752         9640                Farsø     56.8      9.29
#> 753         9670              Løgstør     56.9      9.27
#> 754         9681                Ranum     56.9      9.20
#> 755         9940                 Læsø     57.3     11.01
#> 756         9520             Skørping     56.8      9.91
#> 757         9530             Støvring     56.9      9.82
#> 758         9541              Suldrup     56.8      9.69
#> 759         9574                Bælum     56.8     10.12
#> 760         9575             Terndrup     56.8     10.06
#> 761         9610              Nørager     56.7      9.67
#> 762         9500                Hobro     56.6      9.80
#> 763         9510                Arden     56.8      9.89
#> 764         9550             Mariager     56.7     10.01
#> 765         9560              Hadsund     56.8     10.21
#> 766         9440              Aabybro     57.1      9.74
#> 767         9460               Brovst     57.1      9.52
#> 768         9490              Pandrup     57.2      9.64
#> 769         9492              Blokhus     57.3      9.60
#> 770         9493               Saltum     57.3      9.66
#> 771         9690          Fjerritslev     57.1      9.26
#> 772         9000              Aalborg     57.0      9.91
#> 773         9200           Aalborg SV     57.0      9.87
#> 774         9210           Aalborg SØ     57.0      9.94
#> 775         9220          Aalborg Øst     57.0      9.99
#> 776         9230          Svenstrup J     57.0      9.85
#> 777         9240                 Nibe     57.0      9.62
#> 778         9260              Gistrup     57.0      9.99
#> 779         9270               Klarup     57.0     10.05
#> 780         9280            Storvorde     57.0     10.17
#> 781         9293           Kongerslev     56.9     10.12
#> 782         9310              Vodskov     57.1     10.07
#> 783         9362              Gandrup     57.1     10.19
#> 784         9370                 Hals     57.0     10.33
#> 785         9380            Vestbjerg     57.1      9.96
#> 786         9381              Sulsted     57.2      9.96
#> 787         9382             Tylstrup     57.2      9.94
#> 788         9400          Nørresundby     57.1      9.92
#> 789         9430                Vadum     57.1      9.86
#> 790         9480               Løkken     57.4      9.74
#> 791         9760                  Vrå     57.4      9.95
#> 792         9800             Hjørring     57.5      9.97
#> 793         9830                 Tårs     57.4     10.13
#> 794         9850            Hirtshals     57.6      9.97
#> 795         9870               Sindal     57.5     10.24
#> 796         9881             Bindslev     57.6     10.20
#> 797         2670                Greve     55.6     12.30
#> 798         2690           Karlslunde     55.6     12.25
#> 799         4030                 Tune     55.6     12.19
#> 800         4140                Borup     55.5     11.98
#> 801         4600                 Køge     55.5     12.17
#> 802         4623       Lille Skensved     55.5     12.10
#> 803         4632           Bjæverskov     55.5     12.04
#> 804         4681             Herfølge     55.4     12.14
#> 805         4682               Tureby     55.4     12.08
#> 806         4000             Roskilde     55.7     12.10
#> 807         4040             Jyllinge     55.8     12.11
#> 808         4130        Viby Sjælland     55.5     12.02
#> 809         4621             Gadstrup     55.6     12.10
#> 810         2680        Solrød Strand     55.5     12.21
#> 811         4622              Havdrup     55.5     12.12
#> 812         4500          Nykøbing Sj     55.9     11.64
#> 813         4534                Hørve     55.8     11.43
#> 814         4540            Fårevejle     55.8     11.43
#> 815         4550                Asnæs     55.8     11.50
#> 816         4560                  Vig     55.9     11.56
#> 817         4571             Grevinge     55.8     11.59
#> 818         4572      Nørre Asmindrup     55.9     11.62
#> 819         4573                Højby     55.9     11.55
#> 820         4581               Rørvig     55.9     11.75
#> 821         4583       Sjællands Odde     56.0     11.36
#> 822         4300               Holbæk     55.7     11.71
#> 823         4305                  Orø     55.8     11.81
#> 824         4340              Tølløse     55.6     11.73
#> 825         4350             Ugerløse     55.6     11.65
#> 826         4360     Kirke Eskilstrup     55.6     11.77
#> 827         4370        Store Merløse     55.5     11.72
#> 828         4390             Vipperød     55.7     11.74
#> 829         4420             Regstrup     55.7     11.62
#> 830         4440               Mørkøv     55.7     11.51
#> 831         4450              Jyderup     55.7     11.41
#> 832         4520            Svinninge     55.7     11.48
#> 833         4532             Gislinge     55.7     11.55
#> 834         4640                 Faxe     55.2     12.12
#> 835         4653               Karise     55.3     12.20
#> 836         4654       Faxe Ladeplads     55.2     12.16
#> 837         4683              Rønnede     55.3     12.03
#> 838         4690               Haslev     55.3     11.97
#> 839         4270                 Høng     55.5     11.30
#> 840         4281               Gørlev     55.5     11.18
#> 841         4400           Kalundborg     55.7     11.08
#> 842         4460            Snertinge     55.7     11.38
#> 843         4470             Svebølle     55.7     11.29
#> 844         4480        Store Fuglede     55.6     11.17
#> 845         4490     Jerslev Sjælland     55.6     11.23
#> 846         4591           Føllenslev     55.7     11.33
#> 847         4592               Sejerø     55.9     11.13
#> 848         4593            Eskebjerg     55.7     11.27
#> 849         4100             Ringsted     55.4     11.81
#> 850         4174       Jystrup Midtsj     55.5     11.86
#> 851         4200             Slagelse     55.4     11.34
#> 852         4220               Korsør     55.3     11.15
#> 853         4230             Skælskør     55.3     11.30
#> 854         4241             Vemmelev     55.4     11.26
#> 855         4242            Boeslunde     55.3     11.27
#> 856         4243                 Rude     55.2     11.49
#> 857         4244               Agersø     55.2     11.19
#> 858         4245                  Omø     55.2     11.15
#> 859         4261              Dalmose     55.3     11.42
#> 860         4652               Hårlev     55.4     12.23
#> 861         4660       Store Heddinge     55.3     12.38
#> 862         4671               Strøby     55.4     12.30
#> 863         4672            Klippinge     55.4     12.33
#> 864         4673        Rødvig Stevns     55.3     12.37
#> 865         4173           Fjenneslev     55.4     11.66
#> 866         4180                 Sorø     55.4     11.56
#> 867         4190        Munke Bjergby     55.5     11.53
#> 868         4291           Ruds Vedby     55.5     11.38
#> 869         4293            Dianalund     55.5     11.49
#> 870         4295            Stenlille     55.5     11.58
#> 871         4296                Nyrup     55.5     11.65
#> 872         4060           Kirke Såby     55.6     11.86
#> 873         4070       Kirke Hyllinge     55.7     11.89
#> 874         4320                Lejre     55.6     11.97
#> 875         4330               Hvalsø     55.6     11.86
#> 876         4895            Errindlev     54.7     11.50
#> 877         4900              Nakskov     54.8     11.13
#> 878         4912           Harpelunde     54.9     11.07
#> 879         4913            Horslunde     54.9     11.21
#> 880         4920            Søllested     54.8     11.28
#> 881         4930               Maribo     54.8     11.50
#> 882         4941             Bandholm     54.8     11.47
#> 883         4942                 Askø     54.9     11.50
#> 884         4943             Torrig L     54.9     11.32
#> 885         4944                 Fejø     54.9     11.41
#> 886         4945                 Femø     55.0     11.54
#> 887         4951           Nørreballe     54.8     11.43
#> 888         4952          Stokkemarke     54.8     11.37
#> 889         4953           Vesterborg     54.9     11.30
#> 890         4960               Holeby     54.7     11.48
#> 891         4970                Rødby     54.7     11.36
#> 892         4983            Dannemare     54.7     11.19
#> 893         4160          Herlufmagle     55.3     11.75
#> 894         4171               Glumsø     55.4     11.69
#> 895         4250           Fuglebjerg     55.3     11.55
#> 896         4262              Sandved     55.3     11.52
#> 897         4684           Holmegaard     55.3     11.83
#> 898         4700              Næstved     55.2     11.76
#> 899         4733           Tappernøje     55.2     11.97
#> 900         4736       Karrebæksminde     55.2     11.65
#> 901         4800           Nykøbing F     54.8     11.88
#> 902         4840         Nørre Alslev     54.9     11.85
#> 903         4850         Stubbekøbing     54.9     12.04
#> 904         4862             Guldborg     54.9     11.73
#> 905         4863           Eskilstrup     54.9     11.88
#> 906         4871             Horbelev     54.8     12.06
#> 907         4872             Idestrup     54.7     11.98
#> 908         4873           Væggerløse     54.7     11.95
#> 909         4874               Gedser     54.6     11.94
#> 910         4880               Nysted     54.7     11.73
#> 911         4891             Toreby L     54.8     11.78
#> 912         4892             Kettinge     54.7     11.75
#> 913         4894         Øster Ulslev     54.7     11.61
#> 914         4990           Sakskøbing     54.8     11.65
#> 915         4720               Præstø     55.1     12.06
#> 916         4735                 Mern     55.0     12.07
#> 917         4750               Lundby     55.1     11.84
#> 918         4760          Vordingborg     55.0     11.92
#> 919         4771            Kalvehave     55.0     12.15
#> 920         4772             Langebæk     55.0     12.08
#> 921         4773             Stensved     55.0     12.03
#> 922         4780                Stege     55.0     12.29
#> 923         4791                Borre     55.0     12.47
#> 924         4792               Askeby     54.9     12.16
#> 925         4793              Bogø By     54.9     12.05
#> 926         5463             Harndrup     55.5     10.02
#> 927         5464        Brenderup Fyn     55.5      9.97
#> 928         5466              Asperup     55.5      9.90
#> 929         5500           Middelfart     55.5      9.76
#> 930         5580           Nørre Aaby     55.5      9.87
#> 931         5591              Gelsted     55.4      9.96
#> 932         5592                 Ejby     55.4      9.92
#> 933         5492          Vissenbjerg     55.4     10.14
#> 934         5560                Aarup     55.4     10.05
#> 935         5610               Assens     55.3      9.92
#> 936         5620           Glamsbjerg     55.3     10.09
#> 937         5631              Ebberup     55.2      9.99
#> 938         5683               Haarby     55.2     10.11
#> 939         5690             Tommerup     55.3     10.20
#> 940         5600              Faaborg     55.1     10.25
#> 941         5601                  Lyø     55.0     10.15
#> 942         5602             Avernakø     55.0     10.28
#> 943         5603               Bjørnø     55.1     10.25
#> 944         5642             Millinge     55.1     10.17
#> 945         5672                Broby     55.2     10.26
#> 946         5750                Ringe     55.2     10.46
#> 947         5772            Kværndrup     55.2     10.53
#> 948         5792               Årslev     55.3     10.44
#> 949         5854               Gislev     55.2     10.60
#> 950         5856             Ryslinge     55.2     10.54
#> 951         5863       Ferritslev Fyn     55.3     10.58
#> 952         5290              Marslev     55.4     10.52
#> 953         5300           Kerteminde     55.5     10.65
#> 954         5330              Munkebo     55.5     10.55
#> 955         5350              Rynkeby     55.4     10.61
#> 956         5370              Mesinge     55.5     10.63
#> 957         5380                Dalby     55.5     10.67
#> 958         5390             Martofte     55.6     10.63
#> 959         5550            Langeskov     55.4     10.59
#> 960         5540            Ullerslev     55.4     10.66
#> 961         5800               Nyborg     55.3     10.78
#> 962         5853                Ørbæk     55.3     10.66
#> 963         5871               Frørup     55.2     10.76
#> 964         5000             Odense C     55.4     10.39
#> 965         5200             Odense V     55.4     10.33
#> 966         5210            Odense NV     55.4     10.31
#> 967         5220            Odense SØ     55.4     10.46
#> 968         5230             Odense M     55.4     10.40
#> 969         5240            Odense NØ     55.4     10.44
#> 970         5250            Odense SV     55.4     10.34
#> 971         5260             Odense S     55.3     10.39
#> 972         5270             Odense N     55.4     10.36
#> 973         5320              Agedrup     55.4     10.48
#> 974         5491         Blommenslyst     55.4     10.25
#> 975         5700            Svendborg     55.1     10.61
#> 976         5762     Vester Skerninge     55.1     10.46
#> 977         5771            Stenstrup     55.1     10.51
#> 978         5874           Hesselager     55.2     10.77
#> 979         5881           Skårup Fyn     55.1     10.70
#> 980         5882             Vejstrup     55.1     10.71
#> 981         5883                 Oure     55.1     10.72
#> 982         5884                Gudme     55.1     10.70
#> 983         5892      Gudbjerg Sydfyn     55.2     10.66
#> 984         5400              Bogense     55.6     10.09
#> 985         5450              Otterup     55.5     10.40
#> 986         5462                Morud     55.4     10.19
#> 987         5471             Søndersø     55.5     10.20
#> 988         5474             Veflinge     55.5     10.15
#> 989         5485               Skamby     55.5     10.28
#> 990         5900            Rudkøbing     54.9     10.74
#> 991         5932               Humble     54.8     10.69
#> 992         5935             Bagenkop     54.8     10.69
#> 993         5943               Strynø     54.9     10.61
#> 994         5953             Tranekær     55.1     10.88
#> 995         5960              Marstal     54.9     10.51
#> 996         5965             Birkholm     54.9     10.50
#> 997         5970           Ærøskøbing     54.9     10.39
#> 998         5985             Søby Ærø     54.9     10.27
#> 999         6100            Haderslev     55.2      9.52
#> 1000        6500               Vojens     55.2      9.30
#> 1001        6510                 Gram     55.3      9.03
#> 1002        6541              Bevtoft     55.2      9.20
#> 1003        6560           Sommersted     55.3      9.28
#> 1004        6623             Vorbasse     55.6      9.08
#> 1005        7190              Billund     55.7      9.12
#> 1006        7200            Grindsted     55.8      8.92
#> 1007        7250             Hejnsvig     55.7      8.98
#> 1008        7260          Sønder Omme     55.8      8.90
#> 1009        6300              Gråsten     54.9      9.57
#> 1010        6310              Broager     54.9      9.68
#> 1011        6320            Egernsund     54.9      9.62
#> 1012        6400           Sønderborg     54.9      9.78
#> 1013        6430             Nordborg     55.0      9.79
#> 1014        6440         Augustenborg     55.0      9.92
#> 1015        6470               Sydals     54.9      9.96
#> 1016        6240         Løgumkloster     55.1      8.98
#> 1017        6261             Bredebro     55.1      8.77
#> 1018        6270               Tønder     54.9      8.87
#> 1019        6280                Højer     55.0      8.70
#> 1020        6520             Toftlund     55.2      9.04
#> 1021        6534             Agerskov     55.1      9.14
#> 1022        6535          Branderup J     55.1      9.06
#> 1023        6780              Skærbæk     55.2      8.78
#> 1024        6792                 Rømø     55.1      8.54
#> 1025        6690              Gørding     55.5      8.80
#> 1026        6700              Esbjerg     55.5      8.46
#> 1027        6705            Esbjerg Ø     55.5      8.50
#> 1028        6710            Esbjerg V     55.5      8.39
#> 1029        6715            Esbjerg N     55.5      8.46
#> 1030        6731            Tjæreborg     55.5      8.59
#> 1031        6740             Bramming     55.5      8.71
#> 1032        6760                 Ribe     55.3      8.77
#> 1033        6771          Gredstedbro     55.4      8.75
#> 1034        6720                 Fanø     55.4      8.40
#> 1035        6753              Agerbæk     55.6      8.80
#> 1036        6800                Varde     55.6      8.50
#> 1037        6818                 Årre     55.6      8.67
#> 1038        6823              Ansager     55.7      8.75
#> 1039        6830          Nørre Nebel     55.8      8.27
#> 1040        6840               Oksbøl     55.6      8.27
#> 1041        6851       Janderup Vestj     55.6      8.37
#> 1042        6852               Billum     55.6      8.33
#> 1043        6853        Vejers Strand     55.6      8.13
#> 1044        6854                Henne     55.7      8.21
#> 1045        6855               Outrup     55.7      8.35
#> 1046        6857              Blåvand     55.6      8.15
#> 1047        6862              Tistrup     55.7      8.61
#> 1048        6870                Ølgod     55.8      8.62
#> 1049        6600                Vejen     55.5      9.14
#> 1050        6621               Gesten     55.5      9.20
#> 1051        6622                Bække     55.6      9.15
#> 1052        6630              Rødding     55.4      9.11
#> 1053        6650               Brørup     55.5      9.02
#> 1054        6660              Lintrup     55.4      8.98
#> 1055        6670              Holsted     55.5      8.91
#> 1056        6682              Hovborg     55.6      8.94
#> 1057        6683              Føvling     55.4      8.91
#> 1058        6752            Glejbjerg     55.6      8.83
#> 1059        6200             Aabenraa     55.0      9.44
#> 1060        6210                Barsø     55.1      9.56
#> 1061        6230              Rødekro     55.1      9.32
#> 1062        6330              Padborg     54.8      9.35
#> 1063        6340                Kruså     54.9      9.44
#> 1064        6360              Tinglev     54.9      9.24
#> 1065        6372         Bylderup-Bov     55.0      9.10
#> 1066        6392           Bolderslev     55.0      9.27
#> 1067        7000           Fredericia     55.6      9.72
#> 1068        6000              Kolding     55.5      9.48
#> 1069        6051               Almind     55.6      9.48
#> 1070        6052                 Viuf     55.6      9.49
#> 1071        6064              Jordrup     55.6      9.31
#> 1072        6070       Christiansfeld     55.4      9.47
#> 1073        6091                Bjert     55.5      9.57
#> 1074        6092     Sønder Stenderup     55.5      9.62
#> 1075        6093              Sjølund     55.4      9.56
#> 1076        6094                Hejls     55.4      9.60
#> 1077        6580              Vamdrup     55.4      9.31
#> 1078        6640           Lunderskov     55.5      9.31
#> 1079        6040               Egtved     55.6      9.35
#> 1080        7080               Børkop     55.6      9.67
#> 1081        7100                Vejle     55.7      9.52
#> 1082        7120            Vejle Øst     55.7      9.61
#> 1083        7173                Vonge     55.9      9.42
#> 1084        7182             Bredsten     55.7      9.36
#> 1085        7183              Randbøl     55.7      9.26
#> 1086        7184               Vandel     55.7      9.21
#> 1087        7300              Jelling     55.8      9.43
#> 1088        7321             Gadbjerg     55.8      9.31
#> 1089        7323                 Give     55.9      9.25
#> 1090        9100              Aalborg     57.0      9.92
#> 1091        8100             Aarhus C     56.2     10.21
#> 1092        8245            Risskov Ø     56.2     10.25
#> 1093        5100             Odense C     55.4     10.39
#> 1094        6701              Esbjerg     55.5      8.45
#> 1095        7007           Fredericia     55.6      9.75
#> 1096         900          København C     57.0      9.92
#> 1097         960               Udland     56.8      9.51
#> 1098         999          København C     57.7     10.58
#> 1099        1001          København K     55.7     12.57
#> 1100        1002          København K     55.7     12.57
#> 1101        1003          København K     55.7     12.57
#> 1102        1004          København K     55.7     12.57
#> 1103        1005          København K     55.7     12.57
#> 1104        1006          København K     55.7     12.57
#> 1105        1007          København K     55.7     12.57
#> 1106        1008          København K     55.7     12.57
#> 1107        1009          København K     55.7     12.57
#> 1108        1010          København K     55.7     12.57
#> 1109        1011          København K     55.7     12.57
#> 1110        1012          København K     55.7     12.57
#> 1111        1013          København K     55.7     12.57
#> 1112        1014          København K     55.7     12.57
#> 1113        1015          København K     55.7     12.57
#> 1114        1016          København K     55.7     12.57
#> 1115        1017          København K     55.7     12.57
#> 1116        1018          København K     55.7     12.57
#> 1117        1019          København K     55.7     12.57
#> 1118        1020          København K     55.7     12.57
#> 1119        1021          København K     55.7     12.57
#> 1120        1022          København K     55.7     12.57
#> 1121        1023          København K     55.7     12.57
#> 1122        1024          København K     55.7     12.57
#> 1123        1025          København K     55.7     12.57
#> 1124        1026          København K     55.7     12.57
#> 1125        1092          København K     55.7     12.57
#> 1126        1093          København K     55.7     12.57
#> 1127        1095          København K     55.7     12.57
#> 1128        1098          København K     55.7     12.57
#> 1129        1140          København K     55.7     12.57
#> 1130        1147          København K     55.7     12.57
#> 1131        1148          København K     55.7     12.57
#> 1132        1217          København K     55.7     12.57
#> 1133        1240          København K     55.7     12.57
#> 1134        1448          København K     55.7     12.57
#> 1135        1500          København V     55.7     12.57
#> 1136        1501          København V     55.7     12.57
#> 1137        1502          København V     55.7     12.57
#> 1138        1503          København V     55.7     12.57
#> 1139        1504          København V     55.7     12.57
#> 1140        1505          København V     55.7     12.57
#> 1141        1506          København V     55.7     12.57
#> 1142        1507          København V     55.7     12.57
#> 1143        1508          København V     55.7     12.57
#> 1144        1509          København V     55.7     12.57
#> 1145        1510          København V     55.7     12.57
#> 1146        1513      Centraltastning     55.7     12.57
#> 1147        1592          København V     55.7     12.57
#> 1148        1599          København V     55.7     12.57
#> 1149        1630          København V     55.7     12.57
#> 1150        1780          København V     55.7     12.57
#> 1151        1785          København V     55.7     12.57
#> 1152        1786          København V     55.7     12.57
#> 1153        1787          København V     55.7     12.57
#> 1154        1790          København V     55.7     12.57
#> 1155        1835      Frederiksberg C     55.7     12.53
#> 1156         917 Københavns Pakkecent     55.7     12.57
#> 1157         800        Høje Taastrup     55.6     12.27
#> 1158        1532          København V     55.7     12.57
#> 1159        1533          København V     55.7     12.57

We want to calculate distances between a subset of zip areas:

idx <- sample(1:nrow(zips), 5, replace = F)
dat <- zips[idx,]
dat
#>     postal_code      place_name latitude longitude
#> 962        5853           Ørbæk     55.3      10.7
#> 425        1854 Frederiksberg C     55.7      12.5
#> 815        4550           Asnæs     55.8      11.5
#> 220        1460     København K     55.7      12.6
#> 887        4951      Nørreballe     54.8      11.4
distanceMat <- matrix(NA, nrow = length(idx), ncol = length(idx))
colnames(distanceMat) <- str_c(dat$postal_code, dat$place_name, sep = " ") 
rownames(distanceMat) <- colnames(distanceMat)
distanceMat
#>                      5853 Ørbæk 1854 Frederiksberg C 4550 Asnæs 1460 København K 4951 Nørreballe
#> 5853 Ørbæk                   NA                   NA         NA               NA              NA
#> 1854 Frederiksberg C         NA                   NA         NA               NA              NA
#> 4550 Asnæs                   NA                   NA         NA               NA              NA
#> 1460 København K             NA                   NA         NA               NA              NA
#> 4951 Nørreballe              NA                   NA         NA               NA              NA

We can find average distances between two zip codes in dat using function:

library(geodist)
getDist <- function(i, j) {
   return(geodist(dat[i, ], dat[j, ], measure = "haversine") / 1000)  # convert to km (return in meters)
}
getDist(1, 3) # distance between row 1 and 3
#>      [,1]
#> [1,] 81.8

Use nested for loops to fill distanceMat with distances. Assume that the distance from a to b is the same as from b to a. That is, you only have to call the function once for two zip codes.

9.5.5 Exercise (expand_grid)

Consider the solution of Exercise 9.5.4 and assume that you only want to calculate the distance from rows 1 and 5 to rows 2 and 3 in dat. Modify the solution using expand_grid so only one loop is used.