Operaciones lógicas

Del mismo modo en que los operadores aritméticos nos permitían obtener un resultado aritmético (aka, numérico) en nuestros cálculos, existen otros operadores que nos permiten obtener resultados lógicos.

Operadores relacionales

Los primeros de ellos son los relacionales, y ya los conocemos desde el colegio, pero es bueno saber cómo escribirlos en R. La siguiente tabla nos muestra para qué sirve cada uno de ellos.

Operador Uso
> Mayor que
< Menor que
== Igual que
!= Diferente que
>= Mayor o igual que
<= Menor o igual que

Usando operadores relacionales

Empecemos por definir una secuencia del 1 al 6 con la cual vamos a hacer nuestras comparaciones.

secuencia <- 1:6

Primero vamos a utilizar los operadores de igualdad y desigualdad. Tengamos en cuenta que al igual que con las operaciones aritméticas, al comparar una costante, esta se recicla.

secuencia
## [1] 1 2 3 4 5 6
# igual que
secuencia == 6
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE
# diferente que
secuencia != 6
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

Obtenemos los resultados de las comparaciones. En aquellos valores que cumplan la condición, obtenemos un valor TRUE. Vemos que sucede lo mismo cuando usamos los demás operadores relacionales.

secuencia
## [1] 1 2 3 4 5 6
# mayor que
secuencia > 4
## [1] FALSE FALSE FALSE FALSE  TRUE  TRUE
# menor que
secuencia < 4
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
# mayor o igual que
secuencia >= 4
## [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
# menor o igual que
secuencia <= 4
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Ten cuidado al comparar vectores character como numericos porque pueden devolver resultados inesperados. No olvides que operar con un NA siempre devolverá NA.

100 < "11"
## [1] TRUE
1000 > NA
## [1] NA

Operadores lógicos

Para potenciar nuestras habilidades de comparación, podemos hacer uso de operadores lógicos. La siguiente tabla te muestra cuáles son:

Operador Uso
& Y lógico
| O lógico
! NO lógico

Usaremos una secuencia un poco más larga para ver mejor cómo usarlos:

secuencia2 <- 1:8

secuencia2
## [1] 1 2 3 4 5 6 7 8
# Y lógico: el número debe ser mayor que tres Y menor que 6
secuencia2 > 3 & secuencia2 < 6
## [1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
# O lógico: el número debe ser menor que tres O mayor que 6
secuencia2 < 3 | secuencia2 > 6
## [1]  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE
# NO lógico: cambia el valor de la operación
! secuencia2 <= 6
## [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

Listas

Los cuatro vectores que conocimos en la sesión 1 son los llamados vectores atómicos, porque pueden almacenar un tipo específico de información. Hemos conocido también los factores y datetimes, que permiten alterar el comportamiento de estos vectores atómicos. Ahora nos toca conocer las listas.

Función list()

Las listas son objetos especiales, porque nos permiten almacenar cualquier tipo de información. Para crear una, usamos la función list(). Se pueden inspecionar sus elementos de la misma manera que con cualquier otro vector.

mi_vector_1 <- c(1L, "Hola mundo", 3.14159, TRUE)
mi_lista_1 <- list(1L, "Hola mundo", 3.14159, TRUE)

¿Cuál es el resultado de los siguientes bloques de código?

typeof(mi_vector_1)
## [1] "character"
typeof(mi_lista_1)
## [1] "list"

Las listas lucen diferente que un vector atómico

mi_lista_1
## [[1]]
## [1] 1
## 
## [[2]]
## [1] "Hola mundo"
## 
## [[3]]
## [1] 3.14159
## 
## [[4]]
## [1] TRUE

Vemos que este objeto aceptó los cuatro tipos de vectores atómicos sin problema, y que al ser inspeccionado, cada elemento correspondía en sí mismo a un vector atómico.

Elementos con nombre

Del mismo modo que podíamos combinar vectores atómicos con otros vectores atómicos, en las listas podemos agregar vectores creados previamente. En este caso, cada uno de ellos conserva su singularidad. Al crear la lista, podemos asignarle un nombre a cada elemento.

vec_integer <- 1:10
vec_logical <- c(TRUE, FALSE, TRUE, FALSE)
vec_double <- vec_integer*10
vec_character <- as.character(vec_double)
mi_lista_2 <- list(enteros = vec_integer,
                   logicos = vec_logical,
                   decimales = vec_double,
                   texto = vec_character)

mi_lista_2
## $enteros
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $logicos
## [1]  TRUE FALSE  TRUE FALSE
## 
## $decimales
##  [1]  10  20  30  40  50  60  70  80  90 100
## 
## $texto
##  [1] "10"  "20"  "30"  "40"  "50"  "60"  "70"  "80"  "90"  "100"

Combinar listas

Para combinar una lista con otra, basta con incluirlas dentro de una lista nueva. En el código de abajo, se creará una lista con dos elementos, cada uno de ellos sigue siendo una lista.

mi_lista_combinada <- list(mi_lista_1, mi_lista_2)

mi_lista_combinada
## [[1]]
## [[1]][[1]]
## [1] 1
## 
## [[1]][[2]]
## [1] "Hola mundo"
## 
## [[1]][[3]]
## [1] 3.14159
## 
## [[1]][[4]]
## [1] TRUE
## 
## 
## [[2]]
## [[2]]$enteros
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[2]]$logicos
## [1]  TRUE FALSE  TRUE FALSE
## 
## [[2]]$decimales
##  [1]  10  20  30  40  50  60  70  80  90 100
## 
## [[2]]$texto
##  [1] "10"  "20"  "30"  "40"  "50"  "60"  "70"  "80"  "90"  "100"

Dataframes

¿Qué es un data.frame?

Un data.frame es una versión bi-dimensional de una lista, lo que ocasiona que se comporte de manera similar a una tabla. Debido a que esa estructura facilita mucho su comprensión de manera visual y almacenamiento, su uso es muy extendido en el análisis de datos.

Fuera de R, los programas más conocidos que también almacenan sus datos tabularmente son Excel, Google Sheets y SPSS. Es una de las razones por las que resulta muy sencillo trasladar el trabajo realizado en esos programas hacia R.

Es muy común referirse a un data.frame como df, en forma abreviada.

Crear un data.frame

El proceso para crearlos es muy similar al de una lista nombrada. En el siguiente código, estamos creando el objeto df, conformado por tres vectores de cinco elementos cada uno.

df <- data.frame(
  columna1 = 1:5,
  columna2 = c("uno", "dos", "tres", "cuatro", "cinco"),
  columna3 = c("one", "two", "three", "four", "five")
  )
df
##   columna1 columna2 columna3
## 1        1      uno      one
## 2        2      dos      two
## 3        3     tres    three
## 4        4   cuatro     four
## 5        5    cinco     five

En un data.frame, cada vector se convierte en una columna, con cada uno de sus elementos convirtiéndose en una fila, en el orden en que aparecen. Además de eso, el número de fila nos aparece automáticamente como una columna sin nombre.

Obtener un data.frame a partir de una lista

notas <- list(
  matematica = c(20, 15, 17, 19),
  lenguaje = c(18, 12, 11, 19),
  ciencias = c(19, 14, 15, 17)
)
notas
## $matematica
## [1] 20 15 17 19
## 
## $lenguaje
## [1] 18 12 11 19
## 
## $ciencias
## [1] 19 14 15 17

df_notas <- as.data.frame(notas)
df_notas
##   matematica lenguaje ciencias
## 1         20       18       19
## 2         15       12       14
## 3         17       11       15
## 4         19       19       17

Podemos identificar los data.frame porque poseen la clase “data.frame”,

class(df_notas)
## [1] "data.frame"

Obtener un data.frame a partir de vectores

Al igual que con una lista, puedo obtener los elementos (columnas) de mi data.frame a partir de vectores creados previamente. En este caso, la columna heredará el nombre del objeto a partir del cual es creado.

alumnos <- c("Amanda", "Brenda", "Charlie", "Dario")
sexo <- c("F", "F", "M", "M")

df_alumnos <- data.frame(alumnos, sexo)
df_alumnos
##   alumnos sexo
## 1  Amanda    F
## 2  Brenda    F
## 3 Charlie    M
## 4   Dario    M

Ejercicio

Crea tu primer data.frame

Ahora es tu turno. Crea un data.frame con las siguientes tres columnas:

  • nombre
  • apellido
  • cargo

Cada fila debe representar el nombre de alguien famoso.

Guardalo en tu Environment con el nombre “mi_primer_dataframe”

Ejemplo

##    nombre apellido         cargo
## 1 Tsunade    Senju Quinto Hokage
## 2  Minato Namikaze Cuarto Hokage
## 3 Hiruzen Sarutobi Tercer Hokage

head() y tail()

Hasta el momento, hemos trabajado con data.frames pequeños. Normalmente, nuestros datos pueden llegar a tener una gran cantidad de filas y columnas. El data.frame alfabeto contiene dos columnas, cada una contiene las 26 letras del alfabeto (inglés) en mayúsculas y minúsculas, respectivamente.

alfabeto <- data.frame(LETTERS, letters)

Al inspeccionar su contenido obtenemos:

alfabeto
##    LETTERS letters
## 1        A       a
## 2        B       b
## 3        C       c
## 4        D       d
## 5        E       e
## 6        F       f
## 7        G       g
## 8        H       h
## 9        I       i
## 10       J       j
## 11       K       k
## 12       L       l
## 13       M       m
## 14       N       n
## 15       O       o
## 16       P       p
## 17       Q       q
## 18       R       r
## 19       S       s
## 20       T       t
## 21       U       u
## 22       V       v
## 23       W       w
## 24       X       x
## 25       Y       y
## 26       Z       z

Todos los elementos del data.frame aparecen en nuestra pantalla. Con un conjunto de datos de 26 filas esto aún es manejable, pero imagina que estás trabajando con miles o millones de datos, imprimir todos los elementos en tu pantalla no sólo es molesto sino también inútil.

Felizmente, puedes hacer uso de la función head(). Por defecto, imprimirá las seis primeras filas del data.frame que le ingresemos, pero podemos especificar otro número.

# Seis primeras filas por defecto
head(alfabeto)
##   LETTERS letters
## 1       A       a
## 2       B       b
## 3       C       c
## 4       D       d
## 5       E       e
## 6       F       f

# Especificando el número de filas requerido
head(alfabeto, 8)
##   LETTERS letters
## 1       A       a
## 2       B       b
## 3       C       c
## 4       D       d
## 5       E       e
## 6       F       f
## 7       G       g
## 8       H       h

Si lo queremos es ver las últimas filas del data.frame, podemos hacer uso de la función tail(). Nuevamente, por defecto imprime las seis últimas filas, pero se le puede especificar otra cantidad.

# Seis últimas filas
tail(alfabeto)
##    LETTERS letters
## 21       U       u
## 22       V       v
## 23       W       w
## 24       X       x
## 25       Y       y
## 26       Z       z

# Especificando el número de filas requerido
tail(alfabeto, 3)
##    LETTERS letters
## 24       X       x
## 25       Y       y
## 26       Z       z

Descanso de 15 minutos

Tibbles

¿Qué son los tibbles?

Así como los data.frames son listas que se comportan de manera especial, los tibbles son data.frames que se comportan de manera especial. Vamos a conocer de qué manera lo hacen, y por qué es preferible trabajar con ellos.

Ten encuenta que para ello es necesario utilizar el paquete tibble.

library(tibble)

Los tibble son objetos ampliamente utilizados en la actualidad y son parte fundamental del tidyverse, un conjunto de paquetes que comparten una filosofía en común, con el fin de hacer el análisis de datos más accesible y reproducible.

Esta filosofía es visiblemente respaldada por los desarrolladores de RStudio. Debido a esta popularidad , es bastante probable que cuando veas que alguien está hablando de un data.frame, en realidad se esté refiriendo a un tibble.

Crear un tibble a partir de un data.frame

Convertir un data.frame existente en un tibble es bastante sencillo. Basta con colocar nuestro data.frame dentro de as_tibble()[^1].

tbl_notas <- as_tibble(df_notas)

tbl_notas
## # A tibble: 4 x 3
##   matematica lenguaje ciencias
##        <dbl>    <dbl>    <dbl>
## 1         20       18       19
## 2         15       12       14
## 3         17       11       15
## 4         19       19       17

En los tibble, el tipo de columna aparece debajo del encabezado. Esto nos permite tener una idea rápida de la composición de los datos.

Tibbles a partir de listas

Es posible también crear tibbles a partir de listas. Recordemos que originalmente teníamos la lista notas.

notas
## $matematica
## [1] 20 15 17 19
## 
## $lenguaje
## [1] 18 12 11 19
## 
## $ciencias
## [1] 19 14 15 17

Podemos usar as_tibble() directamente en una lista para crear un tibble, sin necesidad de que la lista se convierta primero en un data.frame.

as_tibble(notas)
## # A tibble: 4 x 3
##   matematica lenguaje ciencias
##        <dbl>    <dbl>    <dbl>
## 1         20       18       19
## 2         15       12       14
## 3         17       11       15
## 4         19       19       17

Crear tibbles desde cero

En realidad, no necesitamos crear ningún objeto antes de nuestro tibble. La función tibble() nos permite crearlo directamente, de manera similar a como creamos un data.frame.

tibble(
  enteros = 1:10,
  decimales = enteros/2 
)
## # A tibble: 10 x 2
##    enteros decimales
##      <int>     <dbl>
##  1       1       0.5
##  2       2       1  
##  3       3       1.5
##  4       4       2  
##  5       5       2.5
##  6       6       3  
##  7       7       3.5
##  8       8       4  
##  9       9       4.5
## 10      10       5

Sin embargo, es posible crear un tibble usando una sintaxis diferente con la función tribble().

tribble(
  ~colA, ~colB,
  "a",   1,
  "b",   2,
  "c",   3
)
## # A tibble: 3 x 2
##   colA   colB
##   <chr> <dbl>
## 1 a         1
## 2 b         2
## 3 c         3

La clase tibble

El atributo que ocasiona que un objeto en R se comporte de manera especial es la clase. Además de la clase “data.frame”, los tibble contiene las clases “tbl_df” y “tbl”.

class(tbl_notas)
## [1] "tbl_df"     "tbl"        "data.frame"

Cuando nuestro df es pequeño, ya hemos visto que nos indica el tipo de columna debajo de su encabezado. Si hemos prestado atención, también habremos podido ver que nos muestra sus dimensiones antes del encabezado. Esto es muy útil en los tibble, porque por defecto no imprimen el df completo, sino sólo las diez primeras filas.

Recordemos el df alfabeto, contiene las 26 letras del alfabeto, en mayúsculas en su primera columna y en minúsculas en la segunda. Vamos a crear una versión tibble de este data.frame.

tbl_alfabeto <- as_tibble(alfabeto)

Comparemos cómo son impresos.

# Impresión de data.frame
alfabeto
##    LETTERS letters
## 1        A       a
## 2        B       b
## 3        C       c
## 4        D       d
## 5        E       e
## 6        F       f
## 7        G       g
## 8        H       h
## 9        I       i
## 10       J       j
## 11       K       k
## 12       L       l
## 13       M       m
## 14       N       n
## 15       O       o
## 16       P       p
## 17       Q       q
## 18       R       r
## 19       S       s
## 20       T       t
## 21       U       u
## 22       V       v
## 23       W       w
## 24       X       x
## 25       Y       y
## 26       Z       z

# Impresión de tibble
tbl_alfabeto
## # A tibble: 26 x 2
##    LETTERS letters
##    <chr>   <chr>  
##  1 A       a      
##  2 B       b      
##  3 C       c      
##  4 D       d      
##  5 E       e      
##  6 F       f      
##  7 G       g      
##  8 H       h      
##  9 I       i      
## 10 J       j      
## # ... with 16 more rows

A pesar de que no se imprime el tibble completo, nos da las señales suficientes para saber que contiene 26 filas y dos columnas.

Otra diferencia se da en la inspección de las columnas. Como sabemos, los data.frame imprimen todo su contenido, incluyendo la cantidad total de columnas, en cambio los tibble sólo imprimen las columnas que caben en nuestra pantalla, dando un mensaje informativo al respecto. Veamos el ejemplo del dataset flights, contenido en el paquete nycflights13.

library(nycflights13)

flights
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Vemos que es un tibble con 336776 filas y 19 columnas. Por comodidad, el tibble sólo imprimió las diez primeras filas, y las columnas que no alcanzaron en la pantalla están descritas debajo, con su nombre y su tipo.

Ejercicio

Crea tu propio tibble

Ahora es tu turno, recrea el siguiente tibble. Puedes hacerlo usando el método que quieras.

## # A tibble: 4 x 2
##   actor             papel      
##   <chr>             <chr>      
## 1 Leonardo DiCaprio Rick Dalton
## 2 Brad Pitt         Cliff Booth
## 3 Margot Robbie     Sharon Tate
## 4 Emile Hirsch      Jay Sebring

dplyr

Hemos aprendido a crear tibbles y data.frames. Lo siguiente es aprender a utilizarlos. De ahora en adelante, nuestros ejemplos sólo utilizarán tibbles y me referiré a ellos como “df”.

¿Qué es dplyr?

Es un paquete para R que nos permite trabajar con mayor facilidad nuestros datos tabulares. Para poder usar sus funciones, debemos cargar el paquete. Como forma parte de los paquetes del tidyverse, podemos cargar todos juntos a la vez.

# Para cargar sólo dplyr
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

# Para cargar todo el tidyverse
library(tidyverse)

En resumen, sus funciones nos permiten realizar las siguientes tareas:

  • Filtrar observaciones de acuerdo a sus valores con filter().
  • Organizar las filas de acuerdo a sus valores con arrange().
  • Seleccionar variables por su nombre con select().
  • Modificar las variables de nuestro conjunto de datos con mutate().
  • Resumir nuestros datos en valores representativos con summarise().
  • Agrupar nuestros datos para operar en ellos con group_by().

Usaremos como ejemplo el dataset “gapminder.xlsx”.

Contiene información de la expectativa de vida (lifeExp), población (pop) y el PBI per cápita (gdpPercap) de 142 países de 1952 a 2007.

library(readxl)

gapminder <- read_xlsx("data/gapminder.xlsx")

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # ... with 1,694 more rows

filter()

La función filter() nos simplifica la tarea de hacer subsetting a nuestro conjunto de datos. Podemos elegir obtener sólo la información referida a Perú por ejemplo. El primer argumento de filter() es el df que queremos filtrar, y los siguientes argumentos son las pruebas lógicas que le queremos aplicar.

filter(gapminder, country == "Peru")
## # A tibble: 12 x 6
##    country continent  year lifeExp      pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Peru    Americas   1952    43.9  8025700     3759.
##  2 Peru    Americas   1957    46.3  9146100     4245.
##  3 Peru    Americas   1962    49.1 10516500     4957.
##  4 Peru    Americas   1967    51.4 12132200     5788.
##  5 Peru    Americas   1972    55.4 13954700     5938.
##  6 Peru    Americas   1977    58.4 15990099     6281.
##  7 Peru    Americas   1982    61.4 18125129     6435.
##  8 Peru    Americas   1987    64.1 20195924     6361.
##  9 Peru    Americas   1992    66.5 22430449     4446.
## 10 Peru    Americas   1997    68.4 24748122     5838.
## 11 Peru    Americas   2002    69.9 26769436     5909.
## 12 Peru    Americas   2007    71.4 28674757     7409.

Dentro de filter(), R entiende que country se refiere a la columna country del df gapminder y sólo filtra aquellos elementos dentro de esa columna que son iguales a "Peru".

Es posible añadir más de una condición. Supongamos que queremos la información de Perú, pero sólo a partir del año 1992.

filter(gapminder, country == "Peru", year >= 1992)
## # A tibble: 4 x 6
##   country continent  year lifeExp      pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Peru    Americas   1992    66.5 22430449     4446.
## 2 Peru    Americas   1997    68.4 24748122     5838.
## 3 Peru    Americas   2002    69.9 26769436     5909.
## 4 Peru    Americas   2007    71.4 28674757     7409.

Añadir una nueva prueba lógica funciona igual que utilizar el operador &. Evidentemente, aún podemos utilizar otros operadores lógicos. Supongamos que queremos obtener la data a partir de 1992 para Perú y Chile.

filter(gapminder, 
       country == "Peru" | country == "Chile", 
       year >= 1992)
## # A tibble: 8 x 6
##   country continent  year lifeExp      pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile   Americas   1992    74.1 13572994     7596.
## 2 Chile   Americas   1997    75.8 14599929    10118.
## 3 Chile   Americas   2002    77.9 15497046    10779.
## 4 Chile   Americas   2007    78.6 16284741    13172.
## 5 Peru    Americas   1992    66.5 22430449     4446.
## 6 Peru    Americas   1997    68.4 24748122     5838.
## 7 Peru    Americas   2002    69.9 26769436     5909.
## 8 Peru    Americas   2007    71.4 28674757     7409.

Si quiero obtener la información de varios países, puedo ahorrarme algo de tipeo usando %in% dentro de filter(). Esta vez le pediré los datos a partir del 2002.

filter(gapminder, 
       country %in% c("Peru", "Chile", "Colombia", "Mexico"),
       year >= 2002)
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9  15497046    10779.
## 2 Chile    Americas   2007    78.6  16284741    13172.
## 3 Colombia Americas   2002    71.7  41008227     5755.
## 4 Colombia Americas   2007    72.9  44227550     7007.
## 5 Mexico   Americas   2002    74.9 102479927    10742.
## 6 Mexico   Americas   2007    76.2 108700891    11978.
## 7 Peru     Americas   2002    69.9  26769436     5909.
## 8 Peru     Americas   2007    71.4  28674757     7409.

Ejercicio

Consejo de seguridad de la ONU

Filtra la información de los países miembros permanentes del consejo de seguridad de la ONU de entre 1962 y 2002.

  • Países:
    • China
    • France
    • United Kingdom
    • United States
    • Russia (no está presente en el set de datos)

Asia y Africa

¿Cuántos países de Asia y África fueron incluidos en el conjunto de datos para el año 2007?

¿Cuántos de esos países tenían una esperanza de vida mayor a 60 años?

Para los siguientes verbos

gapminder_subset <- filter(gapminder, 
       country %in% c("Peru", "Chile", "Colombia", "Mexico"),
       year >= 2002)
gapminder_subset
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9  15497046    10779.
## 2 Chile    Americas   2007    78.6  16284741    13172.
## 3 Colombia Americas   2002    71.7  41008227     5755.
## 4 Colombia Americas   2007    72.9  44227550     7007.
## 5 Mexico   Americas   2002    74.9 102479927    10742.
## 6 Mexico   Americas   2007    76.2 108700891    11978.
## 7 Peru     Americas   2002    69.9  26769436     5909.
## 8 Peru     Americas   2007    71.4  28674757     7409.

arrange()

La utilidad de arrange() es que nos permite ordenar nuestros datos en base a las variables que escojamos. Recuerda nuestro subset de gapminder.

gapminder_subset
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9  15497046    10779.
## 2 Chile    Americas   2007    78.6  16284741    13172.
## 3 Colombia Americas   2002    71.7  41008227     5755.
## 4 Colombia Americas   2007    72.9  44227550     7007.
## 5 Mexico   Americas   2002    74.9 102479927    10742.
## 6 Mexico   Americas   2007    76.2 108700891    11978.
## 7 Peru     Americas   2002    69.9  26769436     5909.
## 8 Peru     Americas   2007    71.4  28674757     7409.

Está ordenado por el orden alfabético de la columna country. Podemos indicarle que se ordene por año.

arrange(gapminder_subset, year)
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9  15497046    10779.
## 2 Colombia Americas   2002    71.7  41008227     5755.
## 3 Mexico   Americas   2002    74.9 102479927    10742.
## 4 Peru     Americas   2002    69.9  26769436     5909.
## 5 Chile    Americas   2007    78.6  16284741    13172.
## 6 Colombia Americas   2007    72.9  44227550     7007.
## 7 Mexico   Americas   2007    76.2 108700891    11978.
## 8 Peru     Americas   2007    71.4  28674757     7409.

Ahora aparecen primero los datos del 2002 y luego los del 2007. Por defecto, el orden se hace en forma ascendente. Si uso la función desc() rodeando la columna elegida, ocurre lo contrario.

arrange(gapminder_subset, desc(year))
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Chile    Americas   2007    78.6  16284741    13172.
## 2 Colombia Americas   2007    72.9  44227550     7007.
## 3 Mexico   Americas   2007    76.2 108700891    11978.
## 4 Peru     Americas   2007    71.4  28674757     7409.
## 5 Chile    Americas   2002    77.9  15497046    10779.
## 6 Colombia Americas   2002    71.7  41008227     5755.
## 7 Mexico   Americas   2002    74.9 102479927    10742.
## 8 Peru     Americas   2002    69.9  26769436     5909.

Puedo ordenar en base a más de una columna, sólo debo agregarla como otro argumento. Por ejemplo, si quiero ver el orden en las expectativas de vida por año.

arrange(gapminder_subset, year, lifeExp)
## # A tibble: 8 x 6
##   country  continent  year lifeExp       pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>     <dbl>     <dbl>
## 1 Peru     Americas   2002    69.9  26769436     5909.
## 2 Colombia Americas   2002    71.7  41008227     5755.
## 3 Mexico   Americas   2002    74.9 102479927    10742.
## 4 Chile    Americas   2002    77.9  15497046    10779.
## 5 Peru     Americas   2007    71.4  28674757     7409.
## 6 Colombia Americas   2007    72.9  44227550     7007.
## 7 Mexico   Americas   2007    76.2 108700891    11978.
## 8 Chile    Americas   2007    78.6  16284741    13172.

En ambos años, Perú tuvo la expectativa de vida más baja.

Ejercicios

Por completar…