Dictionaries in R

1 Load packages

library(tidyverse)  # data wrangling

2 Are there Dictionaries in R?

There are not built-in dictionaries in R such in a way like they are in Python. But there’s somthing similar. The R-way of working with dictionaries is using named vectors or named lists.

3 Named vectors as dictonaries

Let’s define a vector with names:

cities <- c("France" = "Paris", "Germany" = "Berlin", "UK" = "London")

print(cities)
#>   France  Germany       UK 
#>  "Paris" "Berlin" "London"

The names (France, Germany, UK) work as keys and the values (Paris, Berlin, London) work as the *values.

4 Assign keys to a dictionary

If you would like to assign names after having created the vector, no problem:

Here’s a vector without names:

cities2 <- c("Rome", "Madrid", "Warsaw")

Now let’s assign names:

names2 <- c("Italy", "Spain", "Poland")

names(cities2) <- names2

cities2
#>    Italy    Spain   Poland 
#>   "Rome" "Madrid" "Warsaw"

As can be seen, we have now added values to the keys in the dictionary.

5 Adding elements to a dictionary

cities["China"] <- "Beijing"

cities
#>    France   Germany        UK     China 
#>   "Paris"  "Berlin"  "London" "Beijing"

6 Changing the order of the keys

cities2
#>    Italy    Spain   Poland 
#>   "Rome" "Madrid" "Warsaw"

Use indexing to adress the names/keys of the entries in order to change the order:

cities2[c("Italy", "Poland", "Spain")]
#>    Italy   Poland    Spain 
#>   "Rome" "Warsaw" "Madrid"

7 Combining dictionaries

cities3 <- c(cities, cities2)
cities3
#>    France   Germany        UK     China     Italy     Spain    Poland 
#>   "Paris"  "Berlin"  "London" "Beijing"    "Rome"  "Madrid"  "Warsaw"

8 Looking up the keys for a given value

Use vector indexing to get the value (e.g., Paris) for a given key (e.g., France):

cities["France"]
#>  France 
#> "Paris"

In addition, it is possible to look up multiple values in one go:

cities[c("France", "UK")]
#>   France       UK 
#>  "Paris" "London"

9 Using position index to look-up values

cities[1]
#>  France 
#> "Paris"
cities[c(1,3)]
#>   France       UK 
#>  "Paris" "London"

10 Searching for some value

Say we are looking for a value where the first two letters are “Pa”:

cities[str_detect(cities, "^Pa")]
#>  France 
#> "Paris"

Note that str_detect is from {{stringr}}, part of {{tidyverse}}.

11 Searching for the value given some key fragments

Assume we are searching the for the value of the key (country) starting with “It”.

For starters, here are the values (country names):

names(cities2)
#> [1] "Italy"  "Spain"  "Poland"
cities2[str_detect(names(cities2), "^It")]
#>  Italy 
#> "Rome"

12 Check whether the dictionary contains some key

Do we have the country “UK” in our dictionary?

"UK" %in% names(cities3)
#> [1] TRUE

Yes, we do:

cities3
#>    France   Germany        UK     China     Italy     Spain    Poland 
#>   "Paris"  "Berlin"  "London" "Beijing"    "Rome"  "Madrid"  "Warsaw"

13 Sort values alphabetically

sort(cities)
#>     China   Germany        UK    France 
#> "Beijing"  "Berlin"  "London"   "Paris"

14 Sort keys alphabetically

Using the same approach as abover, we now sort the keys (country names):

sorted_keys <- sort(names(cities))
sorted_keys
#> [1] "China"   "France"  "Germany" "UK"

And we now sort the values accordingly:

cities[sorted_keys]
#>     China    France   Germany        UK 
#> "Beijing"   "Paris"  "Berlin"  "London"

Synonymously:

cities[sort(names(cities))]
#>     China    France   Germany        UK 
#> "Beijing"   "Paris"  "Berlin"  "London"

15 Lists instead of vectors

It is possible to use a list instead of a vector:

cities_list <- list("France" = "Paris", "Germany" = "Berlin", "UK" = "London")

print(cities_list)
#> $France
#> [1] "Paris"
#> 
#> $Germany
#> [1] "Berlin"
#> 
#> $UK
#> [1] "London"

For indexing lists, it is usually more effective to use the double bracket operator:

cities_list[[3]]
#> [1] "London"

The simple bracket operator will not give back a simplified element, but instead a list:

cities_list[2]
#> $Germany
#> [1] "Berlin"

17 Reproducibility

#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.2.1 (2022-06-23)
#>  os       macOS Big Sur ... 10.16
#>  system   x86_64, darwin17.0
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Europe/Berlin
#>  date     2024-02-17
#>  pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source
#>  blogdown      1.18    2023-06-19 [1] CRAN (R 4.2.0)
#>  bookdown      0.36    2023-10-16 [1] CRAN (R 4.2.0)
#>  bslib         0.6.1   2023-11-28 [1] CRAN (R 4.2.0)
#>  cachem        1.0.8   2023-05-01 [1] CRAN (R 4.2.0)
#>  callr         3.7.3   2022-11-02 [1] CRAN (R 4.2.0)
#>  cli           3.6.2   2023-12-11 [1] CRAN (R 4.2.0)
#>  codetools     0.2-19  2023-02-01 [1] CRAN (R 4.2.0)
#>  colorspace    2.1-0   2023-01-23 [1] CRAN (R 4.2.0)
#>  crayon        1.5.2   2022-09-29 [1] CRAN (R 4.2.1)
#>  devtools      2.4.5   2022-10-11 [1] CRAN (R 4.2.1)
#>  digest        0.6.33  2023-07-07 [1] CRAN (R 4.2.0)
#>  dplyr       * 1.1.4   2023-11-17 [1] CRAN (R 4.2.0)
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.2.0)
#>  evaluate      0.23    2023-11-01 [1] CRAN (R 4.2.0)
#>  fansi         1.0.6   2023-12-08 [1] CRAN (R 4.2.0)
#>  fastmap       1.1.1   2023-02-24 [1] CRAN (R 4.2.0)
#>  forcats     * 1.0.0   2023-01-29 [1] CRAN (R 4.2.0)
#>  fs            1.6.3   2023-07-20 [1] CRAN (R 4.2.0)
#>  generics      0.1.3   2022-07-05 [1] CRAN (R 4.2.0)
#>  ggplot2     * 3.4.4   2023-10-12 [1] CRAN (R 4.2.0)
#>  glue          1.6.2   2022-02-24 [1] CRAN (R 4.2.0)
#>  gtable        0.3.4   2023-08-21 [1] CRAN (R 4.2.0)
#>  hms           1.1.3   2023-03-21 [1] CRAN (R 4.2.0)
#>  htmltools     0.5.7   2023-11-03 [1] CRAN (R 4.2.0)
#>  htmlwidgets   1.6.2   2023-03-17 [1] CRAN (R 4.2.0)
#>  httpuv        1.6.11  2023-05-11 [1] CRAN (R 4.2.0)
#>  jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.2.0)
#>  jsonlite      1.8.8   2023-12-04 [1] CRAN (R 4.2.0)
#>  knitr         1.45    2023-10-30 [1] CRAN (R 4.2.1)
#>  later         1.3.1   2023-05-02 [1] CRAN (R 4.2.0)
#>  lifecycle     1.0.4   2023-11-07 [1] CRAN (R 4.2.1)
#>  lubridate   * 1.9.3   2023-09-27 [1] CRAN (R 4.2.0)
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.2.0)
#>  memoise       2.0.1   2021-11-26 [1] CRAN (R 4.2.0)
#>  mime          0.12    2021-09-28 [1] CRAN (R 4.2.0)
#>  miniUI        0.1.1.1 2018-05-18 [1] CRAN (R 4.2.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.2.0)
#>  pillar        1.9.0   2023-03-22 [1] CRAN (R 4.2.0)
#>  pkgbuild      1.4.0   2022-11-27 [1] CRAN (R 4.2.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.2.0)
#>  pkgload       1.3.2.1 2023-07-08 [1] CRAN (R 4.2.0)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.2.0)
#>  processx      3.8.2   2023-06-30 [1] CRAN (R 4.2.0)
#>  profvis       0.3.8   2023-05-02 [1] CRAN (R 4.2.0)
#>  promises      1.2.1   2023-08-10 [1] CRAN (R 4.2.0)
#>  ps            1.7.5   2023-04-18 [1] CRAN (R 4.2.0)
#>  purrr       * 1.0.2   2023-08-10 [1] CRAN (R 4.2.0)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.2.0)
#>  Rcpp          1.0.11  2023-07-06 [1] CRAN (R 4.2.0)
#>  readr       * 2.1.4   2023-02-10 [1] CRAN (R 4.2.0)
#>  remotes       2.4.2.1 2023-07-18 [1] CRAN (R 4.2.0)
#>  rlang         1.1.2   2023-11-04 [1] CRAN (R 4.2.0)
#>  rmarkdown     2.25    2023-09-18 [1] CRAN (R 4.2.0)
#>  rstudioapi    0.15.0  2023-07-07 [1] CRAN (R 4.2.0)
#>  sass          0.4.8   2023-12-06 [1] CRAN (R 4.2.0)
#>  scales        1.2.1   2022-08-20 [1] CRAN (R 4.2.0)
#>  sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.2.0)
#>  shiny         1.8.0   2023-11-17 [1] CRAN (R 4.2.1)
#>  stringi       1.8.3   2023-12-11 [1] CRAN (R 4.2.0)
#>  stringr     * 1.5.1   2023-11-14 [1] CRAN (R 4.2.1)
#>  tibble      * 3.2.1   2023-03-20 [1] CRAN (R 4.2.0)
#>  tidyr       * 1.3.0   2023-01-24 [1] CRAN (R 4.2.0)
#>  tidyselect    1.2.0   2022-10-10 [1] CRAN (R 4.2.0)
#>  tidyverse   * 2.0.0   2023-02-22 [1] CRAN (R 4.2.0)
#>  timechange    0.2.0   2023-01-11 [1] CRAN (R 4.2.0)
#>  tzdb          0.4.0   2023-05-12 [1] CRAN (R 4.2.0)
#>  urlchecker    1.0.1   2021-11-30 [1] CRAN (R 4.2.0)
#>  usethis       2.2.2   2023-07-06 [1] CRAN (R 4.2.0)
#>  utf8          1.2.4   2023-10-22 [1] CRAN (R 4.2.0)
#>  vctrs         0.6.5   2023-12-01 [1] CRAN (R 4.2.0)
#>  withr         3.0.0   2024-01-16 [1] CRAN (R 4.2.1)
#>  xfun          0.41    2023-11-01 [1] CRAN (R 4.2.0)
#>  xtable        1.8-4   2019-04-21 [1] CRAN (R 4.2.0)
#>  yaml          2.3.8   2023-12-11 [1] CRAN (R 4.2.0)
#> 
#>  [1] /Users/sebastiansaueruser/Rlibs
#>  [2] /Library/Frameworks/R.framework/Versions/4.2/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────