- 1 Load packages
- 2 Are there Dictionaries in R?
- 3 Named vectors as dictonaries
- 4 Assign keys to a dictionary
- 5 Adding elements to a dictionary
- 6 Changing the order of the keys
- 7 Combining dictionaries
- 8 Looking up the keys for a given value
- 9 Using position index to look-up values
- 10 Searching for some value
- 11 Searching for the value given some key fragments
- 12 Check whether the dictionary contains some key
- 13 Sort values alphabetically
- 14 Sort keys alphabetically
- 15 Lists instead of vectors
- 16 Further reading
- 17 Reproducibility
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"
16 Further reading
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
#>
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────