15  Datos separados

15.1 Introducción

Para responder de manera efectiva a las preguntas que nos interesan sobre el mundo social, a menudo necesitamos acceder a una gran variedad de datos que incluyen aspectos socioeconómicos, políticos, demográficos y otros ámbitos. Estos datos acostumbran a estar dispersos en varias bases de datos. Se plantea así un problema importante, puesto que para analizarlos eficazmente, es necesario ubicar toda esta información en un único conjunto de datos. En esta sección veremos las herramientas que permiten juntar todas las variables que nos interesan en un solo marco de datos. Para ilustrar esta idea, fijémonos en la tabla 15.1, que presenta dos conjuntos de datos que contienen un pequeño número de observaciones.

La tabla a contiene información relativa al PIB per cápita y la población de cuatro países: Francia, Alemania, la República Checa y Austria, mientras que la tabla b proporciona información sobre el idioma principal de los tres primeros países, así como de los Estados Unidos. La unión manual de estas dos tablas en un único conjunto de datos no presenta una gran dificultad con herramientas como Excel, puesto que solo hay que crear una nueva columna en la primera tabla y aparejar el idioma con su país correspondiente. Sin embargo, la complejidad de esta tarea aumenta significativamente cuando disponemos de miles de observaciones, momento en que se requieren procedimientos automatizados para aparejar los datos de manera más eficiente.

(a) PIB per cápita y población
country code gdpcap pop
France FR 43518 67
Germany DE 50801 83
Czechia CZ 26378 11
Austria AT NA 9
(b) Idioma
country cowc lang
French Republic FR French
Federal Republic of Germany DE German
Czech Republic CZ Czech
United States of America US English

Tabla 15.1: Marcos de datos separados

Con R, la unión de dos o más marcos de datos de miles de observaciones es una tarea relativamente sencilla si estos datos disponen de claves de referencia y sabemos utilizar las funciones join. En este módulo, empezaremos por explorar algunos ejemplos de qué son las claves de referencia, muchas de las cuales ya han aparecido en marcos de datos de capítulos anteriores. Seguidamente, veremos cómo unir marcos de datos con las funciones join del paquete dplyr. En el tercer apartado se introduce el paquete countrycode, que permite unir marcos de datos que no tienen claves de referencia común. Y finalmente, en el último apartado se muestra un ejemplo de cómo unir datos de desarrollo económico con datos de democracia.

15.2 Claves de referencia

Las claves de referencia son valores que sirven para identificar las unidades de observación y establecer conexiones entre datos de diferentes fuentes. Al mismo tiempo, constituyen una herramienta imprescindible para unir conjuntos de datos con R. A lo largo de los módulos anteriores, hemos examinado varias tablas que incluyen estas claves de referencia (como las que se han ilustrado en la tabla 1.4 o en la figura 11.19). Estas claves simplifican la unidad de observación mediante un código numérico o de carácter, hecho que permite identificar cada unidad con un único y reducido conjunto de cifras o letras. A continuación se detallan algunos de los códigos más comunes, ordenados por niveles de análisis:

Tabla 15.2: Códigos de país
ctryname ccown cwdi
Argentina 160 ARG
Armenia 371 ARM
Australia 900 AUS
Austria 305 AUT
Azerbaijan 373 AZE
Bahamas 31 BHS
Bahrain 692 BHR
Bangladesh 771 BGD
  • Organizaciones Internacionales (OIs): Las principales claves de referencia de las OIs se encuentran en la Intergovernmental Organizations dataset (v3) (Pevehouse et al., 2019; Wallace & Singer, 1970) de Correlates of War, el primer proyecto que codificó las OIs. Anteriormente, en la tabla 1.3 del módulo 1 hemos visto estos códigos en la variable ioname.

  • Estados: El estado es la unidad con más diversidad de codificaciones1. Esta variedad se debe a que a lo largo de los años ha habido diferentes organizaciones, grupos de investigación y oficinas estadísticas que han creado su propio código por varios motivos, relacionados con el ámbito de estudio o el propósito de la codificación2. En la tabla 15.2, se pueden encontrar dos de los formatos de codificación más frecuentes. La columna ccown contiene la codificación numérica de estados según el proyecto Correlates of War (Correlates of War Project, 2017), mientras que la columna cwdi contiene la codificación de tres caracteres de los Worldwide Development Indicators (WDI) (Kaufmann et al., 2009).

    Los valores que se muestran son códigos que sirven para identificar de manera única cada país. Así, si cogemos la nomenclatura que está asociada a la columna ccown, Argentina se codifica como el 160 y Armenia como el 371. Por otro lado, utilizando la nomenclatura del WDI, Argentina se codifica como ARG y Armenia como ARM. Como veremos más adelante, el paquete de R countrycode (Arel-Bundock, 2022) es una herramienta muy necesaria para cualquier proyecto que tenga como unidad de análisis el estado.

  • 1 En la caja ¿Cómo saber cuál es el código apropiado? se pueden ver 13 sistemas de claves diferentes, pero hay más.

  • 2 Para más información, ver el módulo El Sistema de Estados

  • Tabla 15.3: Códigos de municipio
    nombre cmun
    Abadiño 48001
    Abanto y Ciérvana-Abanto Zierbena 48002
    Ajangiz 48911
    Alonsotegi 48912
    Amorebieta-Etxano 48003
    Amoroto 48004
    Arakaldo 48005
    Arantzazu 48006
    • Unidades subestatales: Algunas organizaciones internacionales o regionales tienen sus propias codificaciones de unidades territoriales subestatales como pueden ser las comunidades autónomas españolas o los länders alemanes. Un ejemplo es el sistema NUTS (responde al francés Nomenclature des Unités territoriales statistiques), utilizado por Eurostat para clasificar las unidades territoriales en varios niveles. Anteriormente, en el módulo 10 ya hemos visto estas claves en la columna geo del marco de datos nuts (ver figura 11.19). En el ámbito global, existen otros intentos de clasificar las unidades subestatales, como los del Global Data Lab o el ISO 3166-2, aunque no se utilizan con mucha frecuencia.
    Tabla 15.4: Códigos de partido
    country id name_short
    ESP 2413 AR
    ESP 8262 AUN
    ESP 4588 ASR
    ESP 829 AIC
    ESP 841 ARM
    ESP 8271 AlV
    ESP 7464 AN
    ESP 441 AP/PP
    • Unidades locales: En general, cada país desarrolla su propio sistema de clasificación para sus divisiones político-administrativas internas. Como ejemplo, en España, el Instituto Nacional de Estadística (INE) asigna códigos específicos a cada municipio y sección censal del país. En la columna cmun de la tabla 15.3, se pueden encontrar los códigos INE asociados a algunos municipios de Euskadi.

    • Partidos políticos: Las organizaciones políticas no gubernamentales que han logrado un nivel más estandarizado de codificación son los partidos políticos. Recientemente, Party facts (Döring & Regel, 2019) ha desarrollado una base de datos que permite enlazar varias fuentes de información relacionadas con los partidos políticos. Entre ellas, por ejemplo, se incluye la Global Party Survey (Norris, 2020), que mide a gran escala el posicionamiento ideológico de más de un millar de partidos políticos. En España, Party facts ha catalogado hasta 113 partidos diferentes. En la tabla 15.4 vemos un pequeño abstracto, con la codificación numérica en la columna id y la codificación de carácter en la columna name_short.

    • Otros: Existe una gran cantidad de sistemas de clasificación que permiten enlazar bases de datos. A escala internacional, la estandarización y la codificación de estos sistemas son responsabilidad de organizaciones como la International Standard Organization (ISO) o Naciones Unidas. Un ejemplo es la Standard International Trade Classification (SITC) de las Naciones Unidas, que clasifica las mercancías y permite el seguimiento del comercio internacional en varios niveles.

    Aparte de estas unidades, otras claves de referencia también nos permiten enlazar conjuntos de datos. Es el caso de los identificadores únicos (números de identificación de usuario, códigos de producto, etc.) o bien las fechas. Como veremos más adelante, es muy frecuente utilizar los años como claves de unión cuando forman parte de la unidad de observación. Por ejemplo, si en varios conjuntos de datos la unidad de observación es estado-año, tanto el código de los estados como el año serán las dos columnas clave que utilizaremos para unir los datos.

    15.3 Las funciones join

    En esta sección veremos cómo operan cuatro de las funciones join3. Todas estas funciones sirven para juntar conjuntos de datos que tienen una columna en común. Al inicio de esta sección se mostraban dos conjuntos de datos en la tabla 15.1, donde, si nos fijamos, la columna compartida se denomina code en la primera tabla y cowc en la segunda. Esta columna, que utilizaremos para la unión de los dos conjuntos de datos, lo denominaremos columna clave. Los valores de la columna clave son compartidos en los dos conjuntos de datos: Francia se llama FR, Alemania DE y República Checa CZ. Austria y los Estados Unidos, en cambio, solo se encuentran en uno de los dos conjuntos.

  • 3 Existen dos funciones join más, que no veremos en este apartado. Son semi_join(), que devuelve las filas del primer marco de datos que coincidan con la columna o columnas clave del segundo marco de datos, y anti_join(), que devuelve las filas del primer marco de datos que no coincidan con la columna o columnas clave del segundo marco de datos.

  • La sintaxis utilizada para juntar los datos es la misma en cualquier función de join. Esta sintaxis consta de tres argumentos. En el primer argumento se indica el nombre del primer marco de datos, en el segundo argumento el nombre del segundo marco de datos y en el tercer argumento el nombre de la columna clave.

    xxxx_join(df1, df2, by = "columna")

    Si en los dos marcos de datos que formarán la unión el nombre de la columna clave no coincide, se especifica de la siguiente manera:

    xxxx_join(df1, df1, by = c("nom_col1" = "nom_col2"))

    Ejercicio 15.1 (Crea el código) A continuación, exploraremos cómo combinar los conjuntos de datos de la tabla 15.1 utilizando cada una de las cuatro funciones join. Así veremos qué resultado produce cada función.

    • Para examinar estas funciones, es necesario que crees los marcos de datos df1 y df2 a partir del código siguiente.
    df1 <- tibble(country = c("France", "Germany", "Czechia", "Austria"),
                  code = c("FR", "DE", "CZ", "AT"),
                  gdpcap = c(43518, 50801, 26378, NA),
                  pop = c(67, 83, 11, 9))
    df2 <- tibble(country = c("French Republic", 
                              "Federal Republic of Germany",
                              "Czech Republic", "United States of America"),
                  cowc = c("FR", "DE", "CZ", "US"),
                  lang = c("French", "German", "Czech", "English"))

    15.3.1 Left join

    La función left_join() devuelve todas las filas del primer marco de datos y las filas del segundo marco de datos que coincidan con la columna o columnas clave. En el código siguiente se especifica el nombre de la columna clave del primer marco de datos code y del segundo marco de datos cowc porque los nombres no coinciden. Si hubieran tenido el mismo nombre (por ejemplo, se hubieran denominado code en los dos marcos de datos) se habría podido poner únicamente el nombre de la columna en el argumento by.

    left_join(df1, df2, by = c("code" = "cowc"))
    ## # A tibble: 4 × 6
    ##   country.x code  gdpcap   pop country.y                   lang  
    ##   <chr>     <chr>  <dbl> <dbl> <chr>                       <chr> 
    ## 1 France    FR     43518    67 French Republic             French
    ## 2 Germany   DE     50801    83 Federal Republic of Germany German
    ## 3 Czechia   CZ     26378    11 Czech Republic              Czech 
    ## 4 Austria   AT        NA     9 <NA>                        <NA>
    Columnas con sufijo

    En el resultado de left_join() se puede observar que ahora hay dos columnas de país: country.x y country.y. En una unión, R pone un sufijo en las columnas que llevan el mismo nombre en los dos marcos de datos pero que no están incluidos en la función join como columna clave. Se puede consultar más información sobre este aspecto consultando el argumento suffix en la ayuda de cualquier función join.

    Como se observa, la unión ha mantenido todas las filas del marco de datos df1 de la izquierda y solo las filas del marco de datos df2 de la derecha que coinciden con el de la izquierda en la columna clave. Esto ha producido el siguiente resultado:

    • Las observaciones “FR”, “DE” y “CZ” han quedado aparejadas porque se encuentran en el marco de datos de la izquierda y tienen su pareja en el marco de datos de la derecha.
    • La función left_join() mantiene todas las observaciones del marco de datos de la izquierda, aunque no tengan pareja en el marco de datos de la derecha. Es el caso de “AT”, que tendrá todos sus valores como NA en las columnas provenientes del marco de datos de la derecha.
    • Las observaciones del marco de datos de la derecha que no tienen pareja en el marco de datos de la izquierda no aparecerán. Es el caso de “OS”.

    15.3.2 Right join

    La función right_join() devuelve todas las filas del segundo marco de datos y las filas del primer marco de datos que coincidan con la columna o columnas clave. En este caso, tenemos que pensar que el marco de datos de referencia es el de la derecha, que recibirá los datos del marco de datos de la izquierda, que actúa como secundario.

    right_join(df1, df2, by = c("code" = "cowc"))
    ## # A tibble: 4 × 6
    ##   country.x code  gdpcap   pop country.y                   lang   
    ##   <chr>     <chr>  <dbl> <dbl> <chr>                       <chr>  
    ## 1 France    FR     43518    67 French Republic             French 
    ## 2 Germany   DE     50801    83 Federal Republic of Germany German 
    ## 3 Czechia   CZ     26378    11 Czech Republic              Czech  
    ## 4 <NA>      US        NA    NA United States of America    English

    Con right_join(), la unión ha mantenido todas las filas del marco de datos df2 de la derecha y solo las filas del marco de datos df1 de la izquierda que en la columna clave coinciden con el de la derecha. Esto ha producido el siguiente resultado:

    • Las observaciones “FR”, “DE” y “CZ” han quedado aparejadas porque están en el marco de datos de la derecha y tienen su pareja en el marco de datos de la izquierda.
    • La función right_join() mantiene todas las observaciones del marco de datos de la derecha, aunque no tengan pareja en el marco de datos de la izquierda. Es el caso de “OS”, que tendrá todos sus valores como NA en las columnas provenientes del marco de datos de la izquierda.
    • Las observaciones del marco de datos de la izquierda que no tienen pareja en el marco de datos de la derecha no aparecerán. Es el caso de “AT”.

    15.3.3 Inner join

    La función inner_join() devuelve solo las filas del primero y el segundo marco de datos que coincidan con la columna o columnas clave. Esta función es la más restrictiva de las cuatro, puesto que eliminará todas las observaciones que no tengan pareja.

    inner_join(df1, df2, by = c("code" = "cowc"))
    ## # A tibble: 3 × 6
    ##   country.x code  gdpcap   pop country.y                   lang  
    ##   <chr>     <chr>  <dbl> <dbl> <chr>                       <chr> 
    ## 1 France    FR     43518    67 French Republic             French
    ## 2 Germany   DE     50801    83 Federal Republic of Germany German
    ## 3 Czechia   CZ     26378    11 Czech Republic              Czech

    Tal como se puede apreciar, la unión ha preservado solo las observaciones que coinciden en la columna clave de los marcos de datos df1 y df2. Esto ha producido el siguiente resultado:

    • Las observaciones “FR”, “DE” y “CZ” se han conservado y aparejado porque se encuentran en ambos marcos de datos.
    • Las observaciones “AT” y “OS” se han eliminado. En el caso de “AT”, esta eliminación se debe a que no tiene una coincidencia en el marco de datos de la derecha. En cuanto a “OS”, se ha eliminado porque no tiene una pareja en el marco de datos de la izquierda.

    15.3.4 Full join

    La función full_join() devuelve todas las filas y columnas del primero y el segundo marco de datos. Esta función es la más inclusiva de las cuatro, puesto que conserva todas las observaciones, aunque solo aparezcan en un marco de datos. Lógicamente, esta es la unión que producirá más datos perdidos.

    full_join(df1, df2, by = c("code" = "cowc"))
    ## # A tibble: 5 × 6
    ##   country.x code  gdpcap   pop country.y                   lang   
    ##   <chr>     <chr>  <dbl> <dbl> <chr>                       <chr>  
    ## 1 France    FR     43518    67 French Republic             French 
    ## 2 Germany   DE     50801    83 Federal Republic of Germany German 
    ## 3 Czechia   CZ     26378    11 Czech Republic              Czech  
    ## 4 Austria   AT        NA     9 <NA>                        <NA>   
    ## 5 <NA>      US        NA    NA United States of America    English

    Como se observa, la unión ha mantenido todas las observaciones, tanto del marco de datos df1 de la izquierda como del marco de datos df2 de la derecha. Esto ha producido el siguiente resultado:

    • Las observaciones “FR”, “DE” y “CZ” se han conservado y aparejado porque se encuentran en ambos marcos de datos.
    • Las observaciones que no tienen su pareja en el otro marco de datos, “AT” y “OS”, también se conservan pero los valores en las columnas del marco de datos contrario aparecerán como datos perdidos.

    15.4 El paquete countrycode

    Como ya se ha explicado anteriormente, existe una amplia variedad de organizaciones que utilizan sus propias codificaciones de países, hecho que complica sustancialmente la tarea de combinar datos de diferentes fuentes. Supongamos, por ejemplo, que tenemos dos conjuntos de datos como los que están representados en la tabla 15.5, donde aparece información de tres países: Francia, Alemania, República Checa y el Reino Unido. El primer conjunto de datos incluye el PIB per cápita (gdpcap) y la población (pop), mientras que el segundo conjunto contiene información sobre la lengua oficial de estos países (lang). Sin embargo, observamos que las columnas clave —code en el primer conjunto de datos y cowc en el segundo— utilizan diferentes códigos de país, hecho que nos dificultaría la unión con las funciones join.

    (a) Tabla A
    country code gdpcap pop
    France FR 43518 67
    Germany DE 50801 83
    Czechia CZ 26378 11
    United Kingdom UK 46510 67
    (b) Tabla B
    country cowc lang
    French Republic FRN French
    Federal Republic of Germany GMY German
    Czech Republic CZR Czech
    United Kingdom & Northern Ireland UKG English

    Tabla 15.5: Marcos de datos separados

    Afortunadamente, existen paquetes específicos de R diseñados para simplificar la tarea de unir conjuntos de datos que comparten unidad de observación pero que tienen columnas clave con códigos o nomenclaturas diferentes. Uno de ellos es el paquete countrycode (Arel-Bundock, 2022), que contiene un largo registro de todas las codificaciones de país que emplean grupos y organizaciones internacionales como Correlates of War (COW) (cowc y cown), Eurostat (eurostat), el Fondo Monetario Internacional (FMI) (imf), o el Programa de Desarrollo de las Naciones Unidas (undp). En la figura 15.1 vemos una pequeña muestra de ello.

    country cowc cown ecb eurostat genc3c imf ioc iso2c iso3c iso3n vdem
    Austria AUS 305 AT AT AUT 122 AUT AT AUT 40 144
    Chequia CZR 316 CZ CZ CZE 935 CZE CZ CZE 203 157
    Francia FRN 220 FR FR FRA 132 FRA FR FRA 250 76
    Alemania GMY 255 DE DE DEU 134 GER DE DEU 276 77
    Reino Unido UKG 200 GB UK GBR 112 GBR GB GBR 826 101
    Estados Unidos USA 2 US US USA 111 USA US USA 840 20

    Figura 15.1: Codificaciones de diferentes países

    Si comparamos los datos que aparecen en la tabla 15.5 con esta tabla de códigos, deducimos que la columna code del primer marco de datos usa el código Eurostat, puesto que este es el único código de dos caracteres que utiliza “UK” para referirse al Reino Unido. En el caso del segundo marco de datos, no hay duda que la columna cowc corresponde al código de carácter de Correlates of War. Aparte que lo indica el nombre de la columna, también se puede averiguar porque es el único que utiliza “CZR”, “FRN”, “GMY” y “UKG” para referirse a la República Checa, Francia, Alemania y el Reino Unido, respectivamente. Como veremos enseguida, countrycode utiliza un sistema de conversión que nos permite cambiar un código de país por otro de manera rápida.

    Countrycode

    La mejor manera de ver la inmensidad de countrycode es cargar el paquete y explorar el objeto codelist.

    View(codelist)

    Ejercicio 15.2 (Paquete countrycode) A continuación, aprenderemos a utilizar el paquete countrycode con un sencillo ejemplo.

    • Crea los marcos de datos df3 y df4 a partir de los códigos siguientes:
    df3 <- tibble(country = c("France", "Germany", "Czechia", "Austria"),
                  code = c("FR", "DE", "CZ", "AT"),
                  gdpcap = c(43518, 50801, 26378, NA),
                  pop = c(67, 83, 11, 9))
    df4 <- tibble(country = c("French Republic", 
                              "Federal Republic of Germany",
                              "Czech Republic", "United States of America"),
                  cowc = c("FRN", "GMY", "CZR", "USA"),
                  lang = c("French", "German", "Czech", "English"))

    El paquete countrycode contiene la función countrycode(), que permite convertir fácilmente las codificaciones de país para poder unir diferentes conjuntos de datos. La estructura de la función consta de tres argumentos:

    countrycode(sourcevar, origin, destination)
    • sourcevar: Vector donde se encuentra la columna clave que queremos convertir.
    • origin: Valor de carácter que contiene el nombre de la codificación de la columna clave, como por ejemplo “cowc” o “ecb” 4.
    • destination: Valor de carácter que contiene el nombre de la codificación a la que queremos transformar los datos, como por ejemplo “iso3c” o “eurostat”.
  • 4 Para ver una lista de nombres, teclea ?codelist.

  • A continuación vemos cómo se utiliza el paquete countrycode para transformar los datos de df3 y unirlos con df4 en tres pasos.

    Dentro del sistema pipe, utilizaremos countrycode() dentro de mutate(). Dentro de la función, indicaremos en el primer argumento la columna clave (code), en el segundo argumento que los datos de la columna clave están en formato "iso3c" y en el tercer argumento que queremos transformar estos valores en códigos de Correlates of War ("cowc").

    library(countrycode)
    df3 |> 
      mutate(cowc = countrycode(code, "iso2c", "cowc"))
    # A tibble: 4 × 5
      country code  gdpcap   pop cowc 
      <chr>   <chr>  <dbl> <dbl> <chr>
    1 France  FR     43518    67 FRN  
    2 Germany DE     50801    83 GMY  
    3 Czechia CZ     26378    11 CZR  
    4 Austria AT        NA     9 AUS  

    En la siguiente pipe, utilizaremos una función join para unir los datos con el marco de datos df4. Indicamos que la unión se debe hacer a través de la columna "cowc", que coincide en el primero y en el segundo marco de datos.

    df3 |> 
      mutate(cowc = countrycode(code, "iso2c", "cowc")) |> 
      left_join(df4, by = c("cowc"))
    # A tibble: 4 × 7
      country.x code  gdpcap   pop cowc  country.y                   lang  
      <chr>     <chr>  <dbl> <dbl> <chr> <chr>                       <chr> 
    1 France    FR     43518    67 FRN   French Republic             French
    2 Germany   DE     50801    83 GMY   Federal Republic of Germany German
    3 Czechia   CZ     26378    11 CZR   Czech Republic              Czech 
    4 Austria   AT        NA     9 AUS   <NA>                        <NA>  

    El paquete countrycode también nos permite cambiar el idioma de los datos. Dentro de la función mutate(), hemos usado también la función countrycode() para crear un nuevo vector pais con los nombres de países en español5. Finalmente, hemos limpiado las columnas que no nos interesan con select().

  • 5 Se pueden poner en catalán (cldr.short.ca), gallego (cldr.short.gl), euskera (cldr.short.eu) y otros idiomas.

  • df3 |> 
      mutate(cowc = countrycode(code, "iso2c", "cowc"),
             pais = countrycode(code, "iso2c", "cldr.short.es")) |> 
      left_join(df4, by = c("cowc")) |> 
      select(pais, code:pop, lang)
    # A tibble: 4 × 5
      pais     code  gdpcap   pop lang  
      <chr>    <chr>  <dbl> <dbl> <chr> 
    1 Francia  FR     43518    67 French
    2 Alemania DE     50801    83 German
    3 Chequia  CZ     26378    11 Czech 
    4 Austria  AT        NA     9 <NA>  
    ¿Cómo saber cuál es el código apropiado?

    En el código anterior, hemos detectado que los valores del vector df3$code estaban codificados según la nomenclatura “iso2c” y que los valores del vector df4$cowc estaban codificados según la nomenclatura “cowc”. Pero, ¿cómo hemos sabido que eran estas las nomenclaturas correctas? En verdad, no hay ninguna guía que nos permita saberlo directamente. Pero hay algunos elementos que nos pueden ayudar a averiguarlo:

    • Nombre de columna: A menudo, la columna lleva el nombre asociado, de forma que nos encontraremos con variables que tomen el nombre de iso3c, cowc y otros.
    • Procedencia: Podemos deducirlo por la procedencia de los datos. Los conjuntos de datos de COW siempre tendrán códigos cowc o cown y los del Banco Mundial acostumbran a tener códigos wb o alguna de las nomenclaturas ISO.
    • Libro de códigos: Una opción normalmente infalible es consultar el libro de códigos, donde encontraremos la definición de cada variable y, por lo tanto, nos mostrará cómo se han codificado las columnas clave.
    • Observaciones divergentes: Algunos códigos de país tienen formatos muy particulares. Por ejemplo, si Argelia tiene el código DZA, muy probablemente querrá decir que la columna está codificada en formato ISO (iso3c). Así mismo, codificar el Reino Unido como UKG es propio de COW (cowc). Fijaos en las diferencias en la figura 15.2.
    • Inner join: En caso de duda, también se puede probar con diferentes códigos de país y hacer la unión con la función inner_join(). Lógicamente, el código correcto será el que produzca la unión con más observaciones.
    country cowc cown ecb eurostat fips imf ioc iso2c iso3c iso3n vdem
    Argelia ALG 615 DZ DZ AG 612 ALG DZ DZA 12 103
    Antigua y Barbuda AAB 58 AG AG AC 311 ANT AG ATG 28 NA
    Francia FRN 220 FR FR FR 132 FRA FR FRA 250 76
    Alemania GMY 255 DE DE GM 134 GER DE DEU 276 77
    Reino Unido UKG 200 GB UK UK 112 GBR GB GBR 826 101

    Figura 15.2: Codificaciones de diferentes países

    Ejercicio 15.3 (Los marcos de datos de countrycode) Los siguientes marcos de datos de countrycode contienen toda la información que le sirve a la función countrycode() para transformar los datos de una codificación a otra.

    • Examínalos con las funciones View() y glimpse() y comprueba la gran cantidad de información que contienen.
    cldr_examples
    codelist
    codelist_panel

    Para más información, ver el módulo El Sistema de Estados.

    15.5 Ejemplo: Desarrollo y democracia

    ¿Qué relación existe entre el desarrollo económico y la democracia? Para poder responder a esta pregunta, es evidente que necesitamos datos que provengan de como mínimo dos bases de datos. Por un lado, debemos obtener información sobre el nivel de desarrollo económico de cada país, que deberemos ir a buscar en el Banco Mundial o en algún centro especializado. Y por otro lado, necesitamos datos de democracia, que encontraremos en algún centro de investigación que proporcione datos sobre democracia en varios países. Estas bases de datos tendrán miles de observaciones y, por lo tanto, será muy costoso intentar unirlas manualmente. Será mejor utilizar las funciones join. Además, como veremos a continuación, también usaremos el paquete countrycode, puesto que los dos conjuntos de datos que descargaremos no tienen una columna clave común.

    En primer lugar, para obtener los datos sobre desarrollo económico iremos a buscar la información en las Penn World Tables (PWT) (Feenstra et al., 2015), una popular base de datos que contiene información económica sobre los estados. La mayoría de las bases de datos que construyen tienen como unidad de observación el estado-año. Para obtener los datos, tanto se puede ir a su web y bajar el archivo, como también podemos descargar una versión reducida.

    Ejercicio 15.4 (Descargar PWT) Es recomendable ir a la web del Groningen Growth and Development Centre y descargar la última versión de las PWT. Alternativamente, se puede utilizar el archivo pwt_short.csv. En cualquiera de los dos casos, guardaremos los datos en el objeto pwt_short.

    pwt_short <- read_csv("pwt_short.csv")

    La información que nos interesa son los datos de PIB per cápita, que es como entenderemos en esta actividad el desarrollo económico. Si exploramos el objeto pwt_short, vemos que tenemos 12.810 observaciones, la unidad de observación es el país-año y hay dos columnas clave que nos interesan: el código de país (countrycode) y el año (year).

    head(pwt_short, 5)
    ## # A tibble: 5 × 5
    ##   countrycode country  year rgdpo   pop
    ##   <chr>       <chr>   <dbl> <dbl> <dbl>
    ## 1 ABW         Aruba    1950    NA    NA
    ## 2 ABW         Aruba    1951    NA    NA
    ## 3 ABW         Aruba    1952    NA    NA
    ## 4 ABW         Aruba    1953    NA    NA
    ## 5 ABW         Aruba    1954    NA    NA

    Las PWT no proveen directamente información del PIB per cápita, y por eso se debe calcular a partir de las variables del PIB real (rgdpo) y la población (pop).

    pwt_short <- pwt_short |> 
      mutate(gdpcap = rgdpo * pop)

    Finalmente, deberíamos averiguar cuál es el código de país que aparece en la columna countrycode. Una posibilidad es mirar qué codificación tiene Argelia. Si comparamos el resultado con la información aparecida en la figura 15.2, comprobamos que “DZA” pertenece a la nomenclatura iso3c.

    pwt_short |> 
      filter(country == "Algeria", year == last(year))
    ## # A tibble: 1 × 6
    ##   countrycode country  year   rgdpo   pop    gdpcap
    ##   <chr>       <chr>   <dbl>   <dbl> <dbl>     <dbl>
    ## 1 DZA         Algeria  2019 507488.  43.1 21848889.

    En segundo lugar, podemos descargar los datos de democracia del Varieties of Democracy (V-Dem) Project (Coppedge et al., 2021), una base de datos que crea un índice por varias dimensiones de la democracia y tiene como unidad de observación el estado-año. Para obtener los datos, tanto se puede utilizar el paquete de R vdemdata como descargar una versión reducida de los datos.

    Ejercicio 15.5 (Descargar V-Dem) Los datos de V-Dem se pueden conseguir cargando el paquete de R vdemdata y buscando el objeto vdem dentro del paquete. Alternativamente, se puede utilizar el archivo vdem_short.csv. En ambos casos, guardaremos los datos como objeto vdem_short

    vdem_short <- read_csv("vdem_short.csv")

    De los datos de V-Dem nos interesa el índice de democracia liberal, que está almacenado en la variable v2x_libdem. Si exploramos el objeto vdem_short, vemos que tenemos 11.930 observaciones, la unidad de observación es el país-año y hay dos columnas clave que nos interesan: el código de país (country_id) y el año (year).

    head(vdem_short, 5)
    ## # A tibble: 5 × 4
    ##   country_name country_id  year v2x_libdem
    ##   <chr>             <dbl> <dbl>      <dbl>
    ## 1 Mexico                3  1950      0.096
    ## 2 Mexico                3  1951      0.096
    ## 3 Mexico                3  1952      0.096
    ## 4 Mexico                3  1953      0.097
    ## 5 Mexico                3  1954      0.108

    Ya vemos que el código de país en estos datos de V-Dem es numérico, por lo que ya podemos estar seguros de que no será el mismo que el código de país de los datos PWT, que eran de carácter. A continuación exploramos el objeto codelist_panel, del paquete countrycode, donde filtramos los datos por México, pedimos solo los vectores de carácter y hacemos un glimpse(). Esperamos encontrar que México tenga en algún código el valor 3.

    countrycode::codelist_panel |> 
      filter(country.name.en %in% c("Mexico")) |> 
      select_if(is.numeric) |> 
      glimpse()
    ## Rows: 233
    ## Columns: 16
    ## $ year                       <dbl> 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1…
    ## $ cown                       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
    ## $ fao                        <dbl> 138, 138, 138, 138, 138, 138, 138, 138, 138…
    ## $ gaul                       <dbl> 162, 162, 162, 162, 162, 162, 162, 162, 162…
    ## $ gwn                        <dbl> 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,…
    ## $ imf                        <dbl> 273, 273, 273, 273, 273, 273, 273, 273, 273…
    ## $ iso3n                      <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
    ## $ iso4217n                   <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
    ## $ p4n                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
    ## $ un                         <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
    ## $ un.region.code             <dbl> 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,…
    ## $ un.regionintermediate.code <dbl> 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,…
    ## $ un.regionsub.code          <dbl> 419, 419, 419, 419, 419, 419, 419, 419, 419…
    ## $ unpd                       <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
    ## $ vdem                       <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3…
    ## $ wvs                        <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…

    Observamos que el único código de país donde México tiene el valor 3 es vdem, por lo tanto, ahora ya tenemos toda la información para unir los dos marcos de datos. En este caso, la unidad de observación de los datos es estado-año, por eso deberemos utilizar dos columnas clave para hacer la unión: la que representa el código del estado y la del año. En este caso, la sintaxis será:

    xxxx_join(x, y, by = c("pais", "año")).

    Para hacer la unión, en primer lugar utilizaremos la función countrycode() para transformar el vector pwt_short$countrycode en nomenclatura numérica vdem. Guardaremos los datos en el vector country_id, así conseguimos que la columna clave de país se llame igual que la columna clave del segundo marco de datos. Con inner_join(), unimos los datos con el marco de datos vdem_short, indicando el nombre de las columnas clave de año y país.

    vdem_pwt_join <- pwt_short |> 
      mutate(country_id = countrycode(countrycode, "iso3c", "vdem")) |> 
      inner_join(vdem_short, by = c("year", "country_id"))
    glimpse(vdem_pwt_join)
    ## Rows: 10,573
    ## Columns: 9
    ## $ countrycode  <chr> "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "…
    ## $ country      <chr> "Angola", "Angola", "Angola", "Angola", "Angola", "Angola…
    ## $ year         <dbl> 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 195…
    ## $ rgdpo        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
    ## $ pop          <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
    ## $ gdpcap       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
    ## $ country_id   <dbl> 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 10…
    ## $ country_name <chr> "Angola", "Angola", "Angola", "Angola", "Angola", "Angola…
    ## $ v2x_libdem   <dbl> 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0…

    Ejercicio 15.6 (Las filas que no se unen) La unión mediante inner_join() ha devuelto un marco de datos con 10.563 filas. También nos podríamos preguntar cuáles son los casos que hemos perdido por el camino, porque no estaban en el primer marco de datos o en el segundo. Por eso tenemos la función anti_join().

    • Sustituye inner_join() por anti_join() en el anterior código para saber qué observaciones del primer marco de datos no han encontrado su pareja en el segundo marco de datos.
    • Para saber qué observaciones se han perdido del segundo marco de datos, puedes empezar el código anterior por el marco de datos vdem_short y unirlo con pwt_short con anti_join().