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.
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 |
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
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
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.
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.
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"
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"
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.
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.
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"
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
Ahora es tu turno. Crea un data.frame con las siguientes tres columnas:
Cada fila debe representar el nombre de alguien famoso.
Guardalo en tu Environment con el nombre “mi_primer_dataframe”
## nombre apellido cargo ## 1 Tsunade Senju Quinto Hokage ## 2 Minato Namikaze Cuarto Hokage ## 3 Hiruzen Sarutobi Tercer Hokage
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
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.
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.
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
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
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.
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
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”.
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:
filter().arrange().select().mutate().summarise().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
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.
Filtra la información de los países miembros permanentes del consejo de seguridad de la ONU de entre 1962 y 2002.
¿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?
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.
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.
Por completar…