13  Datos desordenados

13.1 Introducción

Tabla 13.1: IGO dataset (v3)
ioname year albania algeria
ACPEU 1990 0 0
ACSSRB 1990 0 0
CAMES 1990 -9 -9
ACI 1990 0 0
AfDB 1990 0 1
AFGEC 1990 0 0

Ahora ya tenemos un conocimiento general sobre qué se entiende por datos desordenados. Esta situación se da cuando las observaciones no concuerdan con las filas o cuando las variables no concuerdan con las columnas en un conjunto de datos. Teniendo esto en cuenta, si refrescamos la memoria, es posible que haya pequeños detalles que se nos hayan escapado cuando hemos trabajado con este conjunto de datos en una ocasión anterior. Concretamente, en el módulo 1, el primer conjunto de datos que aparecía (tabla 1.3) no cumplía con la definición de tidy data establecida por Wickham. Para profundizar en esta cuestión, volvemos a analizar estos datos en una versión más reducida, que se encuentra en la tabla 13.1 del lateral. Analicémosla detenidamente.

Tabla 13.2: IGO dataset (v3)
ioname year country mem
ACPEU 1990 albania 0
ACPEU 1990 algeria 0
ACPEU 1990 andorra NA
ACPEU 1990 angola 1
ACPEU 1990 antiguabarbuda 1
ACPEU 1990 argentina 0

Sabemos que este conjunto de datos cuantifica la pertenencia o no de los países a las organizaciones internacionales (OIs). Teniendo en cuenta esto, los países, situados en las columnas, no deberían ser considerados como un atributo de las OIs. En lugar de esto, los países deberían ser parte de la unidad de observación del conjunto de datos. Si cada unidad de observación representa la pertenencia de un país a una OI en un año específico (OI-país-año), esto implica que un conjunto de datos ordenado tendría el aspecto que ilustramos en la tabla 13.2. En esta tabla ordenada, la unidad de observación se encuentra claramente definida y es identificable en las tres primeras columnas. Y la cuarta variable, denominada mem (que toma el valor 1 si el país es miembro de la IO en un año determinado, y 0 si no lo es), es una característica de la unidad de observación.

Reforzaremos conceptualmente la distinción entre datos ordenados y datos desordenados si examinamos el próximo ejemplo. La tabla 13.3 incluye tres conjuntos de datos (subtablas A, B y C) que contienen exactamente la misma información. No obstante, solo una de las tres tablas está ordenada.

  1. Es la más larga de las tres subtablas y está formada por seis filas y tres columnas: name, attributes y values.
  2. Tiene tres filas y tres columnas: name, age y education.
  3. Solo tiene dos filas y está formada por cuatro columnas: characteristics, Person 1, Person 2 y Person 2.
(a) Conjunto de datos A
name attributes values
Person 1 age 28
Person 1 education NA
Person 2 age 44
Person 2 education Primary
Person 3 age 32
Person 3 education Secondary
(b) Conjunto de datos B
name age education
Person 1 28 NA
Person 2 44 Primary
Person 3 32 Secondary
(c) Conjunto de datos C
attributes Person 1 Person 2 Person 3
age 28 44 32
education NA Primary Secondary

Tabla 13.3: Marco de datos con diferentes distribuciones de filas y columnas

Ejercicio 13.1 (Tabla ordenada) Fíjate que los tres conjuntos de datos de la tabla 13.3 contienen exactamente la misma información. Examínalas bien y responde:

  • De acuerdo con los criterios de Wickham, ¿cuál de estos conjuntos de datos se puede considerar ordenado?

El conjunto de datos B.

Artículo académico

Para conocer los fundamentos de tidydata, podéis consultar el artículo académico Tidy Data (Wickham, 2014), publicado en el Journal of Statistical Software.

El segundo conjunto de datos es el único que se puede considerar ordenado. Las observaciones corresponden a las tres personas que estamos investigando, mientras que sus características o variables son el identificador del individuo (name), su edad (age) y su nivel de educación (education).

13.2 ¿Por qué desordenados?

Los principios de tidy data pueden parecer tan evidentes que, equivocadamente, se puede pensar que los datos ordenados son extremadamente comunes. Sin embargo, la realidad es que los datos ordenados no son muy habituales. Esto se debe a varios motivos por los que los datos a menudo se conservan en estado desordenado:

  • Muchas personas no están familiarizadas con los principios de tidy data. Por ejemplo, es habitual poner los años como valor en las columnas (2014, 2015, 2016…), aunque realmente no sean una variable, sino valores (ver la tabla 13.4 como ejemplo).
  • Se pueden almacenar los datos desordenados por cuestiones de espacio. Por ejemplo, si descargáramos los datos de la Intergovernmental Organizations (v3), veríamos que es un conjunto de datos desordenado que tiene 16.139 filas y 235 columnas, que suman un total de 3.792.665 de valores. En cambio, si se ordenan los datos nos quedaría un conjunto de datos con 3.502.163 filas y 20 columnas, que sumaría 70.043.260 de valores. Almacenados en formato CSV, el archivo desordenado ocupará 10.3Mb y el archivo ordenado 566.3Mb.
  • A la hora de crear una base de datos desde cero, puede resultar más eficiente para quien codifica los datos que la tabla se mantenga en un formato desordenado. Los datos siempre se pueden reordenar más adelante con un sencillo código de R.
  • Para reproducir determinados gráficos, es necesario que algunas variables estén en una sola columna, hecho que obliga a desordenar los datos.

Ejercicio 13.2 (El paquete tidyr) El paquete tidyr contiene todas las herramientas necesarias para ordenar datos, así como ejemplos varios de marcos de datos ordenados y desordenados. Carga el paquete tidyr y explora los siguientes marcos de datos:

  • table1, table2, table3, table4a, table4b, table5.
  • De cada marco de datos, consulta la ayuda (ejemplo, ?table1) para ver un pequeño libro de códigos sobre los datos que contiene.
  • De entre todos estos marcos de datos, ¿cuál es el que se encuentra ordenado?

table1

13.3 Pivotar datos

Existen dos funciones del paquete tidyr que son esenciales en el proceso de ordenar datos: pivot_longer() y pivot_wider(). Estas funciones permiten pivotar los datos, que significa cambiar la manera como las observaciones y las variables están distribuidas en las filas y las columnas de un marco de datos, manteniendo la misma información. Principalmente, distinguiremos entre dos tipos de tablas desordenadas que necesitaremos pivotar:

  • Tabla ancha: Los datos están desordenados porque algunos nombres de columna no son variables, sino valores de una variable. Se pivota con pivot_longer().
  • Tabla larga: Los datos están desordenados porque algunas variables se han codificado como valores de una columna que no es ninguna variable. Se pivota con pivot_wider().

Veamos, paso a paso, como son estas tablas y el código de R que se debe usar para pivotarlas.

Ejercicio 13.3 (Descargar datos) Descarga los archivos hdi2018l.csv, hdi2018w.csv y hdi2018f.csv y conviértelos en los objetos hdi2018l, hdi2018w y hdi2018f respectivamente. Examina:

  • Las observaciones y las variables de cada marco de datos.
  • Cuál es la unidad de observación de cada marco de datos.
  • ¿Son tablas ordenadas?

13.3.1 Tabla ancha

Una tabla ancha es un conjunto de datos desordenado en que algunos nombres de columna no son variables, sino valores de una variable. El caso más frecuente es cuando los años aparecen como títulos de columna, como vemos en el objeto hdi2018l, que se muestra en la tabla 13.4. Esta tabla contiene información sobre el Índice de Desarrollo Humano en varios países y años. La unidad de observación es país-año, pero el año no figura como observación, sino que cada nombre de columna corresponde a un año determinado.

Tabla 13.4: Tabla ancha con datos de IDH
iso3 country_name 2010 2011 2012 2013 2014 2015 2016 2017
AFG Afghanistan 0.463 0.471 0.482 0.487 0.491 0.493 0.494 0.498
ALB Albania 0.741 0.752 0.767 0.771 0.773 0.776 0.782 0.785
DZA Algeria 0.729 0.736 0.740 0.745 0.747 0.749 0.752 0.754
AND Andorra 0.828 0.827 0.849 0.850 0.853 0.854 0.856 0.858
AGO Angola 0.520 0.534 0.543 0.554 0.564 0.572 0.577 0.581
ATG Antigua and Barbuda 0.766 0.762 0.765 0.768 0.770 0.775 0.778 0.780
ARG Argentina 0.813 0.819 0.818 0.819 0.820 0.822 0.822 0.825
ARM Armenia 0.728 0.731 0.737 0.742 0.745 0.748 0.749 0.755

Una vez identificada la discrepancia en la unidad de observación, pivotar los datos es muy sencillo si se utiliza la función adecuada. Para ordenar una tabla ancha, lo que se hace es reconvertir los títulos de columna en valores de una variable, de forma que en la mayoría de los casos se acorta la anchura de la tabla (eliminando columnas) y se alarga su longitud (añadiendo filas). Como la tabla será más larga que ancha, intuitivamente, la función que necesitamos se llama pivot_longer(), que consta de los siguientes argumentos:

pivot_longer(data, cols, names_to, values_to)
  • data: el nombre del marco de datos.
  • cols: los nombres de columna que se convierten a valores de una variable.
  • names_to: el nombre que recibirá la columna contenedora de los nombres de columna reconvertidos.
  • values_to: el nombre que recibirá la columna que contenga el resto de valores.

Así, en el caso de hdi2018l, se especificarán los argumentos de la siguiente manera:

hdi2018l |> 
  pivot_longer(cols = `2010`:`2017`, names_to = "year", values_to = "hdi")
## # A tibble: 1,512 × 4
##    iso3  country_name year    hdi
##    <chr> <chr>        <chr> <dbl>
##  1 AFG   Afghanistan  2010  0.463
##  2 AFG   Afghanistan  2011  0.471
##  3 AFG   Afghanistan  2012  0.482
##  4 AFG   Afghanistan  2013  0.487
##  5 AFG   Afghanistan  2014  0.491
##  6 AFG   Afghanistan  2015  0.493
##  7 AFG   Afghanistan  2016  0.494
##  8 AFG   Afghanistan  2017  0.498
##  9 ALB   Albania      2010  0.741
## 10 ALB   Albania      2011  0.752
## # ℹ 1,502 more rows

Fíjate que después de aplicar pivot_longer() ahora la tabla está ordenada. La tabla ha aumentado el número de filas, de 189 a 1.512, y ha disminuido el número de columnas, de 10 a 4. Esta conversión ha hecho que la tabla tenga más valores, puesto que ha pasado de 1.890 (189x10) a 6.048 (1.512x4) valores.

13.3.2 Tablas largas

Tabla 13.5: Taula Eurostat
c_birth geo values
EU_OTH BE1 191268
FOR BE1 454453
NAT BE1 654748
NEU BE1 263185
OTH BE1 27309
TOTAL BE1 1136778
UNK BE1 268

Una tabla larga es un conjunto de datos desordenado en el que algunas variables se han codificado como valores de una columna que no es ninguna variable. Es muy habitual encontrar tablas largas en archivos descargados de grandes bases de datos, como Eurostat o del Banco Mundial, por ejemplo. Para ilustrar este punto, se puede observar la tabla 13.5 del lateral, que muestra el resultado de descargar el indicador cens_11coba_r2 a través del paquete de R eurostat. El conjunto de datos resultante muestra la población de Bruselas (NUTS BE1) según el país de nacimiento de sus habitantes. Las variables del conjunto de datos están agrupadas en la columna c_birth, mientras que sus valores se encuentran en la columna values. Observamos, por ejemplo, que hay 654.748 ciudadanos nacionales (“NATO”) y 454.453 extranjeros (“FOR”) en Bruselas.

De manera similar, el objeto hdi2018w, que se muestra en la tabla 13.6, contiene la columna indicator con valores que en realidad son variables: “Carbon dioxide emissions, per capita (tonnes)” y “HIV prevalence, adult (% ages 15-49)”. Así mismo, en la columna data se encuentran los valores de estas variables.

Tabla 13.6: Tabla larga con datos de IDH
iso3 country indicator year data
AFG Afghanistan CO2 emissions, per capita 2010 0.3
AFG Afghanistan CO2 emissions, per capita 2011 0.4
AFG Afghanistan HIV prevalence, (% 15-49y) 2010 0.1
AFG Afghanistan HIV prevalence, (% 15-49y) 2011 0.1
ALB Albania CO2 emissions, per capita 2010 1.6
ALB Albania CO2 emissions, per capita 2011 1.8
ALB Albania Fossil fuel energy consumption (%) 2010 63.2
ALB Albania Fossil fuel energy consumption (%) 2011 61.5

De nuevo, si se sabe identificar la unidad de observación y las variables del marco de datos, pivotar los datos puede resultar relativamente sencillo1. En este caso, para desordenar los datos necesitamos hacer la tabla más ancha, porque tenemos que convertir valores de una columna en variables. Esto reducirá el número de filas y añadirá tantas columnas como valores tenga la columna que contiene las variables. Como estamos ensanchando la tabla, intuitivamente la función que necesitamos se llama pivot_wider(), que consta de los siguientes argumentos:

  • 1 Un truco para identificar las tablas desordenadas que necesitan ser ordenadas con pivot_wider() es saber que acostumbran a tener columnas con el nombre de indicator o value.

  • pivot_wider(data, names_from, values_from)
    • data: el nombre del marco de datos.
    • names_from: el título de la columna donde se encuentran los valores que se convertirán a variables.
    • values_from: el título de la columna donde se encuentran los valores que se convertirán en valores de las nuevas variables.

    Así, en el caso de hdi2018w, se especifican los argumentos de la siguiente manera:

    hdi2018w |> 
      pivot_wider(names_from = indicator, values_from = data)
    ## # A tibble: 386 × 6
    ##    iso3  country      year `CO2 emissions, per capita` HIV prevalence, (% 15-4…¹
    ##    <chr> <chr>       <dbl>                       <dbl>                     <dbl>
    ##  1 AFG   Afghanistan  2010                         0.3                       0.1
    ##  2 AFG   Afghanistan  2011                         0.4                       0.1
    ##  3 ALB   Albania      2010                         1.6                       0.1
    ##  4 ALB   Albania      2011                         1.8                       0.1
    ##  5 DZA   Algeria      2010                         3.3                       0.1
    ##  6 DZA   Algeria      2011                         3.3                       0.1
    ##  7 AND   Andorra      2010                         6.1                      NA  
    ##  8 AND   Andorra      2011                         5.9                      NA  
    ##  9 AGO   Angola       2010                         1.2                       1.7
    ## 10 AGO   Angola       2011                         1.3                       1.8
    ## # ℹ 376 more rows
    ## # ℹ abbreviated name: ¹​`HIV prevalence, (% 15-49y)`
    ## # ℹ 1 more variable: `Fossil fuel energy consumption (%)` <dbl>

    Se puede observar que utilizando pivot_wider() la tabla ha quedado ordenada. Inicialmente, contenía 988 filas y 5 columnas, y ahora consta de 386 filas y 6 columnas. Esto implica una reducción en la longitud de la tabla (menos filas) y un aumento en la anchura, puesto que se han suprimido dos columnas, indicator y data, y se han añadido tres nuevas columnas que representan las diferentes categorías que antes estaban contenidas en la columna indicator. Esta transformación ha generado dos efectos principales: se ha producido una reducción en el número total de valores, pasando de 4.940 a 2.316 valores2, y han aparecido datos perdidos. Fijémonos que en el conjunto de datos inicial no existía la observación de consumo de energía fósil en Afganistán. Pero con la tabla ordenada, estos datos perdidos aparecen, puesto que un conjunto de datos ordenado muestra todas las combinaciones posibles de observaciones y variables.

  • 2 Los valores no necesariamente se reducen siempre que se pivota a tabla ancha así. Según la composición de los datos el número de valores puede aumentar

  • El paquete janitor

    El paquete janitor (Firke, 2021) resulta muy útil para simplificar nombres de variables. La función clean_names() elimina las mayúsculas de los títulos de variables y cambia los espacios por barras bajas. Puedes probar de utilizarla aplicando el código siguiente:

    library(janitor)
    hdi2018w |> 
      pivot_wider(names_from = indicator, values_from = data) |> 
      clean_names()

    13.3.3 Tablas anchas y largas

    Existe un tercer tipo de conjunto de datos desordenado, que es cuando se incumplen las dos condiciones de tabla ordenada: algunas observaciones se encuentran como títulos de columna y algunas variables se encuentran representadas como valores. El objeto hdi2018f, que se reproduce a continuación, reúne estos dos requisitos. Los valores de la variable año se encuentran en las columnas mientras que los valores de la columna indicator son realmente variables. Esto obliga a hacer una doble limpieza de los datos.

    head(hdi2018f, 5)
    ## # A tibble: 5 × 34
    ##   dimension  indicator_id indicator_name iso3  country_name `1990` `1991` `1992`
    ##   <chr>             <dbl> <chr>          <chr> <chr>         <dbl>  <dbl>  <dbl>
    ## 1 Composite…       146206 HDI rank       AFG   Afghanistan      NA     NA     NA
    ## 2 Composite…       146206 HDI rank       ALB   Albania          NA     NA     NA
    ## 3 Composite…       146206 HDI rank       DZA   Algeria          NA     NA     NA
    ## 4 Composite…       146206 HDI rank       AND   Andorra          NA     NA     NA
    ## 5 Composite…       146206 HDI rank       AGO   Angola           NA     NA     NA
    ## # ℹ 26 more variables: `1993` <dbl>, `1994` <dbl>, `1995` <dbl>, `1996` <dbl>,
    ## #   `1997` <dbl>, `1998` <dbl>, `1999` <dbl>, `2000` <dbl>, `2001` <dbl>,
    ## #   `2002` <dbl>, `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, `2006` <dbl>,
    ## #   `2007` <dbl>, `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>,
    ## #   `2012` <dbl>, `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>,
    ## #   `2017` <dbl>, `9999` <dbl>

    El primer paso es alargar la tabla y pasar todas las columnas que tienen como título un año concreto a una variable que se llame year mediante la función pivot_longer(). Guardaremos los cambios en el objeto hdi2018f1 y lo reproduciremos. La tabla ahora es más larga, puesto que ha pasado de tener 25.636 filas y 34 columnas a tener 743.444 filas y 7 columnas.

    hdi2018f1 <- hdi2018f |> 
      pivot_longer(`1990`:`9999`, names_to = "year", values_to = "value")
    head(hdi2018f1)
    ## # A tibble: 6 × 7
    ##   dimension         indicator_id indicator_name iso3  country_name year  value
    ##   <chr>                    <dbl> <chr>          <chr> <chr>        <chr> <dbl>
    ## 1 Composite indices       146206 HDI rank       AFG   Afghanistan  1990     NA
    ## 2 Composite indices       146206 HDI rank       AFG   Afghanistan  1991     NA
    ## 3 Composite indices       146206 HDI rank       AFG   Afghanistan  1992     NA
    ## 4 Composite indices       146206 HDI rank       AFG   Afghanistan  1993     NA
    ## 5 Composite indices       146206 HDI rank       AFG   Afghanistan  1994     NA
    ## 6 Composite indices       146206 HDI rank       AFG   Afghanistan  1995     NA

    El siguiente paso será ensanchar la tabla con la función pivot_wider(). La columna indicator_name contiene varios valores que son realmente variables. Y los valores de estas variables se encuentran en la columna value. Si se aplica la transformación al objeto hdi2018f1, el resultado que produce es una tabla ordenada, con 743.444 observaciones y 162 variables.

    hdi2018f1 |> 
      pivot_wider(names_from = indicator_name, values_from = value)
    ## # A tibble: 743,444 × 162
    ##    dimension         indicator_id iso3  country_name year  `HDI rank`
    ##    <chr>                    <dbl> <chr> <chr>        <chr>      <dbl>
    ##  1 Composite indices       146206 AFG   Afghanistan  1990          NA
    ##  2 Composite indices       146206 AFG   Afghanistan  1991          NA
    ##  3 Composite indices       146206 AFG   Afghanistan  1992          NA
    ##  4 Composite indices       146206 AFG   Afghanistan  1993          NA
    ##  5 Composite indices       146206 AFG   Afghanistan  1994          NA
    ##  6 Composite indices       146206 AFG   Afghanistan  1995          NA
    ##  7 Composite indices       146206 AFG   Afghanistan  1996          NA
    ##  8 Composite indices       146206 AFG   Afghanistan  1997          NA
    ##  9 Composite indices       146206 AFG   Afghanistan  1998          NA
    ## 10 Composite indices       146206 AFG   Afghanistan  1999          NA
    ## # ℹ 743,434 more rows
    ## # ℹ 156 more variables: `Human Development Index (HDI)` <dbl>,
    ## #   `Median age (years)` <dbl>,
    ## #   `Old-age (65 and older) dependency ratio (per 100 people ages 15-64)` <dbl>,
    ## #   `Population ages 15–64 (millions)` <dbl>,
    ## #   `Population ages 65 and older (millions)` <dbl>,
    ## #   `Population under age 5 (millions)` <dbl>, …

    En el resultado, se pueden observar algunas cuestiones importantes. Primero, que la unidad de observación del conjunto de datos, país-año, se puede distinguir claramente en el formato ordenado. Segundo, que después de haber ordenado los datos, algunas columnas como indicator (y probablemente también la columna dimension) ya no tienen ninguna utilidad y, por lo tanto, se podrían eliminar. Y finalmente, que han aparecido muchos datos perdidos. Como ya se ha explicado, una tabla ordenada a menudo revela muchos NA. Los que se observan en la tabla son normales, porque se tienen muy pocos datos de países como Afganistán en los años 90.

    Desordenar tablas para hacer gráficos

    En algunas visualizaciones es habitual que primero se desordenen los datos. Esto es así porque en determinados gráficos algunas de sus proyecciones estéticas pueden estar formadas por varias variables. Por esta razón primero se deben situar todos los nombres de variable en una misma columna. Fijémonos, por ejemplo, en el código que se utiliza para generar la figura 13.1. Este gráfico compara las distribuciones de las variables gdpcap_nuts y pop en España, Italia y Francia. Para hacerlo, se ha creado un facet donde estas dos variables acaban constituyendo valores que separan horizontalmente el facet.

    nuts |> 
      filter(country %in% c("Spain", "Italy", "France")) |> 
      select(country, name, gdpcap_nuts, pop) |> 
      pivot_longer(gdpcap_nuts:pop, names_to = "vars", values_to = "values") |> 
      ggplot(aes(x = values, fill = country)) +
      geom_histogram(show.legend = F) +
      facet_grid(rows = vars(country),
                 cols = vars(vars), scales = "free")

    Figura 13.1: PIB per cápita i población en varios países

    Ejercicio 13.4 (Población del Banco Mundial) El paquete tidyr contiene una variedad de conjuntos de datos desordenados, como billboard y relig_income, que permiten practicar con las funciones pivot_longer() y pivot_wider(). En este ejercicio practicaremos con el marco de datos world_bank_pop.

    • Consulta el libro de códigos con ?world_bank_pop.
    • Examina el marco de datos e identifica la unidad de observación.
    • Pivota los datos para ordenar la tabla.

    Hay múltiples maneras de eliminar las filas que contienen datos perdidos. Una opción es introducir una última línea de código que excluya los NA:

    world_bank_pop |> 
      pivot_longer(`2000`:`2017`, 
                   names_to = "any", 
                   values_to = "valor") |> 
      pivot_wider(names_from = "indicator",
                  values_from = "valor")

    13.4 Otras funciones

    Otro supuesto en que un conjunto de datos incumple los criterios de Wickham es cuando los valores de una variable no se encuentran en una columna, sino en varias. O, al contrario, cuando los valores de dos o más variables no se encuentran separados uno en cada columna, sino en la misma columna. Para limpiar este tipo de anomalías existen las funciones separate() y unite().

    13.4.1 Separar

    La función separate() separa los valores de una columna en varias columnas. La función tiene la siguiente sintaxis:

    separate(data, col, into, sep)
    • data: el nombre del marco de datos.
    • col: el nombre de la columna que contiene los valores que se quiere separar.
    • into: el nombre de las columnas, en forma de vector de carácter, donde irán a parar los valores separados.
    • sep: el carácter o caracteres que hacen de separadores y que, por lo tanto, serán eliminados.

    Para ver un ejemplo, el paquete tidyr contiene el marco de datos table3, donde se observa que a la variable rate el símbolo / está separando dos valores. Si se consulta el libro de códigos, se puede ver como el primer valor responde al número de casos de tuberculosis y el segundo valor a la población total.

    table3
    ## # A tibble: 6 × 3
    ##   country      year rate             
    ##   <chr>       <dbl> <chr>            
    ## 1 Afghanistan  1999 745/19987071     
    ## 2 Afghanistan  2000 2666/20595360    
    ## 3 Brazil       1999 37737/172006362  
    ## 4 Brazil       2000 80488/174504898  
    ## 5 China        1999 212258/1272915272
    ## 6 China        2000 213766/1280428583

    Con separate() se introduce el nombre del marco de datos como primer argumento, el nombre de la columna que se quiere separar (rate) y, al argumento into, los nombres en vector de carácter de las columnas con los datos separados. Como separador, indicaremos entre comillas "/" dentro del argumento sep3. Almacenamos los datos en el objeto t3.

  • 3 Utilizar el argumento sep es, en muchas ocasiones, opcional. R interpretará de manera automática que el separador será un carácter no alfabético como un espacio, un guion, una barra baja, etc. y lo eliminará. En el supuesto de que el símbolo sea un punto (.), se deberá indicar así: "\\.".

  • t3 <- table3 |> 
      separate(rate, into = c("cases", "population"), 
               sep = "/")
    t3
    ## # A tibble: 6 × 4
    ##   country      year cases  population
    ##   <chr>       <dbl> <chr>  <chr>     
    ## 1 Afghanistan  1999 745    19987071  
    ## 2 Afghanistan  2000 2666   20595360  
    ## 3 Brazil       1999 37737  172006362 
    ## 4 Brazil       2000 80488  174504898 
    ## 5 China        1999 212258 1272915272
    ## 6 China        2000 213766 1280428583

    13.4.2 Unir

    La función unite() une los valores de varias columnas en una sola columna. La función tiene la siguiente sintaxis:

    unite(data, col, ..., sep)
    • data: el nombre del marco de datos.
    • col: el nombre de la columna que contendrá los valores que se unirán.
    • ...: el nombre de todas las columnas que se quiere unir.
    • sep: el carácter o caracteres que harán de separadores en la nueva columna.

    Como ejemplo, se puede hacer la operación inversa al código anterior para unir las columnas cases y population del marco de datos t3. En el argumento col se indica que se quiere crear la columna "rate" y en el siguiente argumento que se quiere unir las columnas cases y population. Finalmente, en el tercer argumento se indica el separador. En este caso, se ha marcado un guion "-"4.

  • 4 Por defecto, unite() une los valores indicados con un guion bajo. Si se quiere que los datos estén unidos con otro símbolo, se debe indicar expresamente.

  • t3 |> 
      unite(col = "rate", cases:population, sep = "-")
    ## # A tibble: 6 × 3
    ##   country      year rate             
    ##   <chr>       <dbl> <chr>            
    ## 1 Afghanistan  1999 745-19987071     
    ## 2 Afghanistan  2000 2666-20595360    
    ## 3 Brazil       1999 37737-172006362  
    ## 4 Brazil       2000 80488-174504898  
    ## 5 China        1999 212258-1272915272
    ## 6 China        2000 213766-1280428583