Understanding opendataes

The idea behind opendataes is to allow users to read datasets as easy as possible while providing a stable and predictable behaviour. This is a bit tricky given that https://datos.gob.es aggregates from many different API’s which don’t have a unified standardized behavior. That is, each entity does not conform to a centralized guideline to their data format. In this vignette we’ll explore how we can read data using openes_load but diving into some of the pitfalls of having such an unstandardized API.

First, let’s read through a messy dataset, or in other words, a real-world dataset. An interesting data is one from the Ayuntamiento de Barcelona which details the causes of car accidents in the city. We could do this in two ways: either searching for the direct end path of the URL in https://datos.gob.es or we could search for the data interactively through keywords.

To search for keywords we need to know in advanced which publisher published the data that we’re looking for. Because only very few (as of October 2018) publishers have standardized datasets across their datasets, opendataes will aggregate new publishers slowly as they can show to provide stableness. We can check out which publishers are available with publishers_available.

library(opendataes)
#> 
#> Please cite as:
#> Cimentada, J. and Jorge Lopez (2019). Interact with the datos.gob.es API to download public data from all of Spain R package version 0.0.1

publishers_available
#>                                    publishers publisher_code
#> 1                   Ayuntamiento de Barcelona      L01080193
#> 2                      Ayuntamiento de Madrid      L01280796
#> 3                    Ayuntamiento de Valencia      L01462508
#> 4  Ayuntamiento de Las Palmas de Gran Canaria      L01350167
#> 5                      Ayuntamiento de Bilbao      L01480209
#> 6                    Ayuntamiento de Zaragoza      L01502973
#> 7                      Ayuntamiento de Malaga      L01290672
#> 8                       Ayuntamiento de Gijon      L01330241
#> 9                   Ayuntamiento de Santander      L01390759
#> 10                 Ayuntamiento de Alcobendas      L01280066
#> 11                   Junta de Castilla y Leon      A07002862

Let’s subset the code of ‘Ayuntamiento de Barcelona’ and search for the keyword ‘accidentes’ which means accidents.

pub_code <- publishers_available$publisher_code[publishers_available$publishers == 'Ayuntamiento de Barcelona']
kw <- openes_keywords('accidentes', pub_code)
#> Error in openes_keywords("accidentes", pub_code): There are not datasets matching the keyword `accidentes` and publisher `L01080193`

Alright, so we need to be more creative

kw <- openes_keywords('causas accidentes', pub_code)
#> Error in openes_keywords("causas accidentes", pub_code): There are not datasets matching the keyword `causas accidentes` and publisher `L01080193`

When this happens, it’s just better to search on the website at https://datos.gob.es. Results there show that some of the keywords are ‘Accidentalidad’, ‘Guardia Urbana’ or ‘Causas’ ( see here). To showcase how the R-based search works, we’ll continue using the new key words.

Side note: Why should we do the keyword-based search if we can use the website directly? Because you can use more generic keywords to look for similar datasets. For example, if we searched for ‘elecciones’ (elections) we would get many different datasets related to elections which could be streamlined to openes_load for easy reading. By doing it manually, you’d have to search each datasets separately and copy it’s end path.

Moving on to the keyword search, we type in the new keyword.

kw <- openes_keywords('Accidentalidad', pub_code)
kw
#> # A tibble: 5 x 5
#>   description           publisher    is_readable path_id          url           
#>   <chr>                 <chr>        <lgl>       <chr>            <chr>         
#> 1 Listado de los vehíc… Ayuntamient… TRUE        l01080193-vehic… http://datos.…
#> 2 Personas involucrada… Ayuntamient… TRUE        l01080193-perso… http://datos.…
#> 3 Listado de los accid… Ayuntamient… TRUE        l01080193-accid… http://datos.…
#> 4 Listado de los tipos… Ayuntamient… TRUE        l01080193-accid… http://datos.…
#> 5 Listado de  de la ca… Ayuntamient… TRUE        l01080193-descr… http://datos.…

Looking at the description column, we can see the dataset that we’re looking for which states ‘Listado de los tipos de accidentes gestionados por la Guardia Urbana en la ciudad de Barcelona’. Let’s filter down only to that dataset and pass it to openes_load. Note that openes_load will throw an error if you ever pass this dataset with more than one row. It will only read one dataset and that implies a dataset with only one row.

kw <- kw[grepl('Listado de los tipos de accidentes gestionados por la Guardia Urbana en la ciudad de Barcelona.', kw$description), ]
accidents <- openes_load(kw)

accidents
#> <datos.gob.es API>
#>    Description: Listado de los tipos de accidentes gestionados por la Guardia ...
#>    Publisher: Ayuntamiento de Barcelona
#>    Languages: en, es, ca
#>    Date of release: 2015-11-18 23:00:00
#>    # of files read: 6 out of 11

The printed metadata from above is just a summary of the metadata slot:

accidents$metadata
#> # A tibble: 3 x 8
#>   keywords    language description    url      date_issued         date_modified
#>   <chr>       <chr>    <chr>          <chr>    <dttm>              <chr>        
#> 1 Accidental… en       List of types… http://… 2015-11-18 23:00:00 No modificat…
#> 2 Accidental… es       Listado de lo… http://… 2015-11-18 23:00:00 No modificat…
#> 3 Accidental… ca       Llistat dels … http://… 2015-11-18 23:00:00 No modificat…
#> # … with 2 more variables: publisher <chr>, publisher_data_url <chr>

and the data slot:

accidents$data
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,536 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2019S000253                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  2 2019S006454                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  3 2019S006494                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2019S009443                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2019S004807                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2019S009715                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2019S008122                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2019S001387                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2019S005614                  10 Sant Martí            72 Sant Martí de Prove…
#> 10 2019S005960                  10 Sant Martí            72 Sant Martí de Prove…
#> # … with 10,526 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, NK_Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 6,580 x 22
#>    Numero_expedient Codi_districte Nom_districte    Codi_barri Nom_barri        
#>    <chr>                     <dbl> <chr>                 <dbl> <chr>            
#>  1 2020S000001                   7 Horta-Guinardó           36 la Font d'en Far…
#>  2 2020S000002                   3 Sants-Montjuïc           16 la Bordeta       
#>  3 2020S000003                   2 Eixample                  8 l'Antiga Esquerr…
#>  4 2020S000004                   4 Les Corts                19 les Corts        
#>  5 2020S000005                   2 Eixample                  7 la Dreta de l'Ei…
#>  6 2020S000006                   3 Sants-Montjuïc           17 Sants - Badal    
#>  7 2020S000007                   9 Sant Andreu              60 Sant Andreu      
#>  8 2020S000008                   5 Sarrià-Sant Ger…         23 Sarrià           
#>  9 2020S000009                   2 Eixample                  7 la Dreta de l'Ei…
#> 10 2020S000010                  10 Sant Martí               73 la Verneda i la …
#> # … with 6,570 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, NK_Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <chr>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,551 x 22
#>    Codi_expedient Codi_districte Nom_districte  Codi_barri Nom_barri Codi_carrer
#>    <chr>                   <dbl> <chr>               <dbl> <chr>           <dbl>
#>  1 2018S000001                 3 Sants-Montjuïc         11 el Poble…      198804
#>  2 2018S000002                 2 Eixample                9 la Nova …      361406
#>  3 2018S000003                10 Sant Martí             64 el Camp …      161407
#>  4 2018S000004                 8 Nou Barris             44 Vilapici…      111704
#>  5 2018S000005                 8 Nou Barris             56 Vallbona       330606
#>  6 2018S000006                 4 Les Corts              19 les Corts      144601
#>  7 2018S000007                10 Sant Martí             73 la Verne…       60807
#>  8 2018S000008                 3 Sants-Montjuïc         17 Sants - …      312400
#>  9 2018S000009                 2 Eixample               10 Sant Ant…      323203
#> 10 2018S000010                 8 Nou Barris             45 Porta          100209
#> # … with 10,541 more rows, and 16 more variables: Nom_carrer <chr>,
#> #   Num_postal <chr>, Dia_setmana <chr>, ID_Dia_setmana <chr>, Tipus_dia <chr>,
#> #   Any <dbl>, Mes <dbl>, Nom_mes <chr>, Dia_de_mes <dbl>, Hora_de_dia <chr>,
#> #   Torn <chr>, Tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,521 x 20
#>    `Número d'expedi… `Codi districte` `Nom districte` `Codi barri` `Nom barri`  
#>    <chr>                        <dbl> <chr>                  <dbl> <chr>        
#>  1 2015S000215                     10 Sant Martí                64 el Camp de l…
#>  2 2015S000787                     10 Sant Martí                64 el Camp de l…
#>  3 2015S000390                     10 Sant Martí                64 el Camp de l…
#>  4 2015S007294                     10 Sant Martí                64 el Camp de l…
#>  5 2015S009836                     10 Sant Martí                64 el Camp de l…
#>  6 2015S009453                     10 Sant Martí                64 el Camp de l…
#>  7 2015S007312                     10 Sant Martí                64 el Camp de l…
#>  8 2015S004660                     10 Sant Martí                64 el Camp de l…
#>  9 2015S006407                     10 Sant Martí                64 el Camp de l…
#> 10 2015S009834                     10 Sant Martí                64 el Camp de l…
#> # … with 10,511 more rows, and 15 more variables: Codi carrer <dbl>,
#> #   Nom carrer <chr>, Num postal caption <chr>, Descripció dia setmana <chr>,
#> #   Dia setmana <chr>, Descripció tipus dia <chr>, NK Any <dbl>,
#> #   Mes de any <dbl>, Nom mes <chr>, Dia de mes <dbl>, Hora de dia <chr>,
#> #   Descripció torn <chr>, Descripció tipus accident <chr>,
#> #   Coordenada UTM (Y) <dbl>, Coordenada UTM (X) <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 11,009 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2017S009418                  -1 Desconegut            -1 Desconegut          
#>  2 2017S008852                  -1 Desconegut            -1 Desconegut          
#>  3 2017S001023                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2017S009198                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2017S006546                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2017S003698                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2017S004977                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2017S008080                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2017S004521                  10 Sant Martí            64 el Camp de l'Arpa d…
#> 10 2017S004180                  10 Sant Martí            64 el Camp de l'Arpa d…
#> # … with 10,999 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,701 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2016S002575                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  2 2016S001146                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  3 2016S009619                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2016S003881                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2016S004162                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2016S009951                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2016S004619                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2016S009702                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2016S003529                  10 Sant Martí            64 el Camp de l'Arpa d…
#> 10 2016S008654                  10 Sant Martí            64 el Camp de l'Arpa d…
#> # … with 10,691 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…

Oopss, that’s a weird error. This is one problem that can happen quite often because Spain shares many languages inside it’s territory and some datasets might have different encodings. We can figure out the encoding with readr and just pass it to openes_load.

# Figure out the encoding using only the first dataset which suggests it's ASCII
readr::guess_encoding(accidents$data[[1]])
#> Warning in if (stringi::stri_enc_isascii(lines)) {: the condition has length > 1
#> and only the first element will be used
#> # A tibble: 1 x 2
#>   encoding confidence
#>   <chr>         <dbl>
#> 1 ASCII             1

accidents <- openes_load(kw, encoding = 'ASCII')

The result in the data slot is always a list that will contain data frames either with the data (if it was successful in reading it) or with the URL to the dataset (if it failed reading it for some reason).

accidents$data
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,536 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2019S000253                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  2 2019S006454                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  3 2019S006494                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2019S009443                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2019S004807                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2019S009715                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2019S008122                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2019S001387                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2019S005614                  10 Sant Martí            72 Sant Martí de Prove…
#> 10 2019S005960                  10 Sant Martí            72 Sant Martí de Prove…
#> # … with 10,526 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, NK_Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 6,580 x 22
#>    Numero_expedient Codi_districte Nom_districte    Codi_barri Nom_barri        
#>    <chr>                     <dbl> <chr>                 <dbl> <chr>            
#>  1 2020S000001                   7 Horta-Guinardó           36 la Font d'en Far…
#>  2 2020S000002                   3 Sants-Montjuïc           16 la Bordeta       
#>  3 2020S000003                   2 Eixample                  8 l'Antiga Esquerr…
#>  4 2020S000004                   4 Les Corts                19 les Corts        
#>  5 2020S000005                   2 Eixample                  7 la Dreta de l'Ei…
#>  6 2020S000006                   3 Sants-Montjuïc           17 Sants - Badal    
#>  7 2020S000007                   9 Sant Andreu              60 Sant Andreu      
#>  8 2020S000008                   5 Sarrià-Sant Ger…         23 Sarrià           
#>  9 2020S000009                   2 Eixample                  7 la Dreta de l'Ei…
#> 10 2020S000010                  10 Sant Martí               73 la Verneda i la …
#> # … with 6,570 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, NK_Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <chr>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,551 x 22
#>    Codi_expedient Codi_districte Nom_districte  Codi_barri Nom_barri Codi_carrer
#>    <chr>                   <dbl> <chr>               <dbl> <chr>           <dbl>
#>  1 2018S000001                 3 Sants-Montjuïc         11 el Poble…      198804
#>  2 2018S000002                 2 Eixample                9 la Nova …      361406
#>  3 2018S000003                10 Sant Martí             64 el Camp …      161407
#>  4 2018S000004                 8 Nou Barris             44 Vilapici…      111704
#>  5 2018S000005                 8 Nou Barris             56 Vallbona       330606
#>  6 2018S000006                 4 Les Corts              19 les Corts      144601
#>  7 2018S000007                10 Sant Martí             73 la Verne…       60807
#>  8 2018S000008                 3 Sants-Montjuïc         17 Sants - …      312400
#>  9 2018S000009                 2 Eixample               10 Sant Ant…      323203
#> 10 2018S000010                 8 Nou Barris             45 Porta          100209
#> # … with 10,541 more rows, and 16 more variables: Nom_carrer <chr>,
#> #   Num_postal <chr>, Dia_setmana <chr>, ID_Dia_setmana <chr>, Tipus_dia <chr>,
#> #   Any <dbl>, Mes <dbl>, Nom_mes <chr>, Dia_de_mes <dbl>, Hora_de_dia <chr>,
#> #   Torn <chr>, Tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,521 x 20
#>    `Número d'expedi… `Codi districte` `Nom districte` `Codi barri` `Nom barri`  
#>    <chr>                        <dbl> <chr>                  <dbl> <chr>        
#>  1 2015S000215                     10 Sant Martí                64 el Camp de l…
#>  2 2015S000787                     10 Sant Martí                64 el Camp de l…
#>  3 2015S000390                     10 Sant Martí                64 el Camp de l…
#>  4 2015S007294                     10 Sant Martí                64 el Camp de l…
#>  5 2015S009836                     10 Sant Martí                64 el Camp de l…
#>  6 2015S009453                     10 Sant Martí                64 el Camp de l…
#>  7 2015S007312                     10 Sant Martí                64 el Camp de l…
#>  8 2015S004660                     10 Sant Martí                64 el Camp de l…
#>  9 2015S006407                     10 Sant Martí                64 el Camp de l…
#> 10 2015S009834                     10 Sant Martí                64 el Camp de l…
#> # … with 10,511 more rows, and 15 more variables: Codi carrer <dbl>,
#> #   Nom carrer <chr>, Num postal caption <chr>, Descripció dia setmana <chr>,
#> #   Dia setmana <chr>, Descripció tipus dia <chr>, NK Any <dbl>,
#> #   Mes de any <dbl>, Nom mes <chr>, Dia de mes <dbl>, Hora de dia <chr>,
#> #   Descripció torn <chr>, Descripció tipus accident <chr>,
#> #   Coordenada UTM (Y) <dbl>, Coordenada UTM (X) <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 11,009 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2017S009418                  -1 Desconegut            -1 Desconegut          
#>  2 2017S008852                  -1 Desconegut            -1 Desconegut          
#>  3 2017S001023                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2017S009198                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2017S006546                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2017S003698                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2017S004977                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2017S008080                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2017S004521                  10 Sant Martí            64 el Camp de l'Arpa d…
#> 10 2017S004180                  10 Sant Martí            64 el Camp de l'Arpa d…
#> # … with 10,999 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 10,701 x 22
#>    Numero_expedient Codi_districte Nom_districte Codi_barri Nom_barri           
#>    <chr>                     <dbl> <chr>              <dbl> <chr>               
#>  1 2016S002575                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  2 2016S001146                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  3 2016S009619                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  4 2016S003881                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  5 2016S004162                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  6 2016S009951                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  7 2016S004619                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  8 2016S009702                  10 Sant Martí            64 el Camp de l'Arpa d…
#>  9 2016S003529                  10 Sant Martí            64 el Camp de l'Arpa d…
#> 10 2016S008654                  10 Sant Martí            64 el Camp de l'Arpa d…
#> # … with 10,691 more rows, and 17 more variables: Codi_carrer <dbl>,
#> #   Nom_carrer <chr>, Num_postal_caption <chr>, Descripcio_dia_setmana <chr>,
#> #   Dia_setmana <chr>, Descripcio_tipus_dia <chr>, Any <dbl>, Mes_any <dbl>,
#> #   Nom_mes <chr>, Dia_mes <dbl>, Hora_dia <dbl>, Descripcio_torn <chr>,
#> #   Descripcio_tipus_accident <chr>, Coordenada_UTM_X <dbl>,
#> #   Coordenada_UTM_Y <dbl>, Longitud <dbl>, Latitud <dbl>
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…

As we can see, the data slot from openes_load read a list of data frames but why so many?

This becomes clear once we look at the website of the dataset we’re reading:



As you can see, there are datasets for years 2010, 2011, etc.. where each year is in three different formats (CSV, XLSX and XML as of October 2018).

How does openes_load handle this? Well, to avoid problems between some datasets having slightly different structures between formats, it always aims for the simpler formats in an order of preference. You can check which formats are available with permitted_formats although the user should never have to worry about this because the functions take care of this. However, if you try to read a dataset which only has formats that are not in permitted_formats, openes_load will return the same data structure as if there were a dataset, but the data slot will contain a tibble with the format URL’s of the non-available formats so that the user can read this directly (for example, try reading this openes_load('l01080193-carta-arqueologica-de-barcelona')).

Coming back to the accidents data, this explains why many datasets were read. We can compare the name of each dataset to figure out what they mean.

names(accidents$data)
#>  [1] "Distribucion sin nombre" "Distribucion sin nombre"
#>  [3] "Distribucion sin nombre" "Distribucion sin nombre"
#>  [5] "Distribucion sin nombre" "Distribucion sin nombre"
#>  [7] "Distribucion sin nombre" "Distribucion sin nombre"
#>  [9] "Distribucion sin nombre" "Distribucion sin nombre"
#> [11] "Distribucion sin nombre"

They’re the causes of accidents for different years. Let’s sort them according to the year and check whether all were read.

accidents$data <- accidents$data[sort(names(accidents$data))]
accidents$data
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…
#> 
#> $`Distribucion sin nombre`
#> # A tibble: 1 x 2
#>   format URL                                                                    
#>   <chr>  <chr>                                                                  
#> 1 csv    https://opendata-ajuntament.barcelona.cat/data/dataset/834b8920-0685-4…

But if we look closer, we can see that the data for 2016 and 2017 were not read correctly (as of 2018/10/30). For that case, openes_load returns the link it attempted to read together with the format. For now we’ll exclude these two but the user can read them manually with the provided link. For a simple check, printing the returned object of openes_load will tell you how many files were read.

You can also access the metadata in the metadata slot which contains most of the metadata related to that given dataset. For example..

accidents$metadata
#> # A tibble: 3 x 8
#>   keywords    language description    url      date_issued         date_modified
#>   <chr>       <chr>    <chr>          <chr>    <dttm>              <chr>        
#> 1 Accidental… en       List of types… http://… 2015-11-18 23:00:00 No modificat…
#> 2 Accidental… es       Listado de lo… http://… 2015-11-18 23:00:00 No modificat…
#> 3 Accidental… ca       Llistat dels … http://… 2015-11-18 23:00:00 No modificat…
#> # … with 2 more variables: publisher <chr>, publisher_data_url <chr>

For a detailed description of what each of these column mean, check the documentation of openes_load with ?openes_load.