Introducción a DPLYR

DPLYR Es una libreria orientada a la manipulación de datos

Cada función de esta libreria realiza una sola tarea y sus nombres son verbos, lo cual hace mas sencillo recordar y comprender su función.

dplyr es parte del tidyverse y se integra perfectamente con el resto de las librerias que forman parte de este.

En esta intrducción nos vamos a enfocar a las funciones:

  • filter()
  • select()
  • arrange
  • mutate()
  • summarise()
  • %>%

En esta clase, usaremos dplyr asi como readxl para importar y modificar una tabla

La forma mas sencilla de instalar ambos paquete es ejecutando:

install.packages("dplyr")
install.packages("readxl")

Una vez instalados, es necesario cargar las ambas librerias a nuestro ambiente de trabajo

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
library(readxl)

Para abrir nuestra tabla de excel, usamos la función read_excel

msleep <- read_excel("data/msleep_database_excel.xls", sheet = "msleep", na = "NA")
msleep
## # A tibble: 83 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

1.column name Description 2.name common name 3.genus taxonomic rank 4.vore carnivore, omnivore or herbivore? 5.order taxonomic rank 6.conservation the conservation status of the mammal 7.sleep_total total amount of sleep, in hours 8.sleep_rem rem sleep, in hours 9.sleep_cycle length of sleep cycle, in hours 10.awake amount of time spent awake, in hours 11.brainwt brain weight in kilograms 12.bodywt body weight in kilograms

usa ?read_excel para ver todas las opciones para importar datos

Nota que el encabezado de la tabla es diferente a los data frames que hemos utilizado hasta ahora. Los tibbles son data frames, pero modifican algunas características antiguas para hacernos la vida más fácil.

Los tibbles tienen un método de impresión en la consola refinado: solo muestran las primeras 10 filas y solo aquellas columnas que entran en el ancho de la pantalla. Esto simplifica y facilita trabajar con bases de datos grandes. Además del nombre, cada columna muestra su tipo. Esto último es una gran característica tomada de str().

Si ya te has familiarizado con data.frame(), es importante que tomes en cuenta que tibble() hace menos cosas: nunca cambia el tipo de los inputs (p. ej., ¡nunca convierte caracteres en factores!), nunca cambia el nombre de las variables y nunca asigna nombres a las filas.

Un tibble puede usar nombres de columnas que no son nombres de variables válidos en R (también conocidos como nombres no sintácticos). Por ejemplo, pueden empezar con un caracter diferente a una letra o contener caracteres poco comunes, como espacios. Para referirse a estas variables, tienes que rodearlos de acentos graves: ```

dplry

El paquete incluye un conjunto de comandos que coinciden con las acciones más comunes que se realizan sobre un conjunto de datos (seleccionar filas filter(), seleccionar columnas select(), ordenar arrange(), transformar o añadir nuevas variables mutate(), resumir mediante alguna medida numérica summarise()). Lo que hace que la sintaxis sea especialmente clara es la correspondencia tan nítida entre el comando y la acción. Para llevar a cabo estas acciones debemos tener en cuenta algunas características comunes:

  • El primer argumento siempre es un tibble o data.frame
  • El resto de los argumentos indican los parametros de lo que queremos hacer
  • El resultado siempre tiene tambien estructura de tibble o data frame

1: select()

selecciona una o un set de columnas

Por ejemplo: seleccionar las columnas name y sleep_total

msleep_data <- select(msleep, name, sleep_total)
head(msleep_data)
## # A tibble: 6 x 2
##   name                       sleep_total
##   <chr>                            <dbl>
## 1 Cheetah                           12.1
## 2 Owl monkey                        17  
## 3 Mountain beaver                   14.4
## 4 Greater short-tailed shrew        14.9
## 5 Cow                                4  
## 6 Three-toed sloth                  14.4

Al igual que en ejemplo anteriores, podemos seleccionar todo excepto una clumna especifica usando el operador “-” (resta)

select(msleep, -name)
## # A tibble: 83 x 10
##    genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

Para seleccionar un intervalo de columnas, se puede usar el operador :

select(msleep, name:order)
## # A tibble: 83 x 4
##    name                       genus       vore  order       
##    <chr>                      <chr>       <chr> <chr>       
##  1 Cheetah                    Acinonyx    carni Carnivora   
##  2 Owl monkey                 Aotus       omni  Primates    
##  3 Mountain beaver            Aplodontia  herbi Rodentia    
##  4 Greater short-tailed shrew Blarina     omni  Soricomorpha
##  5 Cow                        Bos         herbi Artiodactyla
##  6 Three-toed sloth           Bradypus    herbi Pilosa      
##  7 Northern fur seal          Callorhinus carni Carnivora   
##  8 Vesper mouse               Calomys     <NA>  Rodentia    
##  9 Dog                        Canis       carni Carnivora   
## 10 Roe deer                   Capreolus   herbi Artiodactyla
## # ... with 73 more rows

De igual manera, se puede usar el operados : para descartar un intervalo de columnas

select(msleep, -(name:order))
## # A tibble: 83 x 7
##    conservation sleep_total sleep_rem sleep_cycle awake  brainwt  bodywt
##    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>   <dbl>
##  1 lc                  12.1      NA        NA      11.9 NA        50    
##  2 <NA>                17         1.8      NA       7    0.0155    0.48 
##  3 nt                  14.4       2.4      NA       9.6 NA         1.35 
##  4 lc                  14.9       2.3       0.133   9.1  0.00029   0.019
##  5 domesticated         4         0.7       0.667  20    0.423   600    
##  6 <NA>                14.4       2.2       0.767   9.6 NA         3.85 
##  7 vu                   8.7       1.4       0.383  15.3 NA        20.5  
##  8 <NA>                 7        NA        NA      17   NA         0.045
##  9 domesticated        10.1       2.9       0.333  13.9  0.07     14    
## 10 lc                   3        NA        NA      21    0.0982   14.8  
## # ... with 73 more rows

Se puede seleccionar las columnas que empiezar con un determinado caracter con la función starts_with(); por ejemplo, si queremos enfocarnos a las columnas con datos de sueño, podemos seleccionar las columnas que empiecen con “sl”

select(msleep, starts_with("sl"))
## # A tibble: 83 x 3
##    sleep_total sleep_rem sleep_cycle
##          <dbl>     <dbl>       <dbl>
##  1        12.1      NA        NA    
##  2        17         1.8      NA    
##  3        14.4       2.4      NA    
##  4        14.9       2.3       0.133
##  5         4         0.7       0.667
##  6        14.4       2.2       0.767
##  7         8.7       1.4       0.383
##  8         7        NA        NA    
##  9        10.1       2.9       0.333
## 10         3        NA        NA    
## # ... with 73 more rows

Si a esto le queremos agregar el nombre de cada especie, se puede ejecutar

select(msleep, name, starts_with("sl"))
## # A tibble: 83 x 4
##    name                       sleep_total sleep_rem sleep_cycle
##    <chr>                            <dbl>     <dbl>       <dbl>
##  1 Cheetah                           12.1      NA        NA    
##  2 Owl monkey                        17         1.8      NA    
##  3 Mountain beaver                   14.4       2.4      NA    
##  4 Greater short-tailed shrew        14.9       2.3       0.133
##  5 Cow                                4         0.7       0.667
##  6 Three-toed sloth                  14.4       2.2       0.767
##  7 Northern fur seal                  8.7       1.4       0.383
##  8 Vesper mouse                       7        NA        NA    
##  9 Dog                               10.1       2.9       0.333
## 10 Roe deer                           3        NA        NA    
## # ... with 73 more rows

Algunos operadores que funcionan de manera similar son:

  • ends_with() = Selecciona las columnas que terminan con una cadena de caracteres
  • contains() = Selecciona las columnas que contienen una cadena de caracteres.
select(msleep, contains("rem"))
## # A tibble: 83 x 1
##    sleep_rem
##        <dbl>
##  1      NA  
##  2       1.8
##  3       2.4
##  4       2.3
##  5       0.7
##  6       2.2
##  7       1.4
##  8      NA  
##  9       2.9
## 10      NA  
## # ... with 73 more rows

con la función evrything() se puede seleccionar todo, y con esto es factible cambiar el order de las columnas. Por ejemplo, si quieremos que la primera columna sea “genus” ejecutamos:

select(msleep, genus, everything())
## # A tibble: 83 x 11
##    genus name  vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Acin~ Chee~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Aotus Owl ~ omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Aplo~ Moun~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Blar~ Grea~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Bos   Cow   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Brad~ Thre~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Call~ Nort~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Calo~ Vesp~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Canis Dog   carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Capr~ Roe ~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

2: filter()

Esta función nos permite seleccionar las filas que cumplan con las condiciones que especifiquemos

por ejemplo, filtrar las especies que tengan mas de 16 horas totales de sueño:

filter(msleep, sleep_total > 16)
## # A tibble: 8 x 11
##   name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##   <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
## 1 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
## 2 Long~ Dasy~ carni Cing~ lc                  17.4       3.1       0.383   6.6
## 3 Nort~ Dide~ omni  Dide~ lc                  18         4.9       0.333   6  
## 4 Big ~ Epte~ inse~ Chir~ lc                  19.7       3.9       0.117   4.3
## 5 Thic~ Lutr~ carni Dide~ lc                  19.4       6.6      NA       4.6
## 6 Litt~ Myot~ inse~ Chir~ <NA>                19.9       2         0.2     4.1
## 7 Gian~ Prio~ inse~ Cing~ en                  18.1       6.1      NA       5.9
## 8 Arct~ Sper~ herbi Rode~ lc                  16.6      NA        NA       7.4
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

Filtrar los animales que tengan mas de 16 horas totales de sueño y tengan un peso corporal mayoy a 1 kg

filter(msleep, sleep_total > 16, bodywt > 1)
## # A tibble: 3 x 11
##   name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##   <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
## 1 Long~ Dasy~ carni Cing~ lc                  17.4       3.1       0.383   6.6
## 2 Nort~ Dide~ omni  Dide~ lc                  18         4.9       0.333   6  
## 3 Gian~ Prio~ inse~ Cing~ en                  18.1       6.1      NA       5.9
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

Ahora queremos filtrar los animales que sean del orden Primates o del orden Perissodactyla

filter(msleep, order=="Primates" | order == "Perissodactyla")
## # A tibble: 15 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  2 Griv~ Cerc~ omni  Prim~ lc                  10         0.7      NA      14  
##  3 Horse Equus herbi Peri~ domesticated         2.9       0.6       1      21.1
##  4 Donk~ Equus herbi Peri~ domesticated         3.1       0.4      NA      20.9
##  5 Pata~ Eryt~ omni  Prim~ lc                  10.9       1.1      NA      13.1
##  6 Gala~ Gala~ omni  Prim~ <NA>                 9.8       1.1       0.55   14.2
##  7 Human Homo  omni  Prim~ <NA>                 8         1.9       1.5    16  
##  8 Mong~ Lemur herbi Prim~ vu                   9.5       0.9      NA      14.5
##  9 Maca~ Maca~ omni  Prim~ <NA>                10.1       1.2       0.75   13.9
## 10 Slow~ Nyct~ carni Prim~ <NA>                11        NA        NA      13  
## 11 Chim~ Pan   omni  Prim~ <NA>                 9.7       1.4       1.42   14.3
## 12 Babo~ Papio omni  Prim~ <NA>                 9.4       1         0.667  14.6
## 13 Potto Pero~ omni  Prim~ lc                  11        NA        NA      13  
## 14 Squi~ Saim~ omni  Prim~ <NA>                 9.6       1.4      NA      14.4
## 15 Braz~ Tapi~ herbi Peri~ vu                   4.4       1         0.9    19.6
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

alternativamente:

filter(msleep, order %in% c("Primates", "Perissodactyla"))
## # A tibble: 15 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  2 Griv~ Cerc~ omni  Prim~ lc                  10         0.7      NA      14  
##  3 Horse Equus herbi Peri~ domesticated         2.9       0.6       1      21.1
##  4 Donk~ Equus herbi Peri~ domesticated         3.1       0.4      NA      20.9
##  5 Pata~ Eryt~ omni  Prim~ lc                  10.9       1.1      NA      13.1
##  6 Gala~ Gala~ omni  Prim~ <NA>                 9.8       1.1       0.55   14.2
##  7 Human Homo  omni  Prim~ <NA>                 8         1.9       1.5    16  
##  8 Mong~ Lemur herbi Prim~ vu                   9.5       0.9      NA      14.5
##  9 Maca~ Maca~ omni  Prim~ <NA>                10.1       1.2       0.75   13.9
## 10 Slow~ Nyct~ carni Prim~ <NA>                11        NA        NA      13  
## 11 Chim~ Pan   omni  Prim~ <NA>                 9.7       1.4       1.42   14.3
## 12 Babo~ Papio omni  Prim~ <NA>                 9.4       1         0.667  14.6
## 13 Potto Pero~ omni  Prim~ lc                  11        NA        NA      13  
## 14 Squi~ Saim~ omni  Prim~ <NA>                 9.6       1.4      NA      14.4
## 15 Braz~ Tapi~ herbi Peri~ vu                   4.4       1         0.9    19.6
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

Es posible filtrar un intervalo de valores utilizando el argumento between(). Por ejemplo, para filtrar las especies que tengan un tiempo total de sueño entre 15 y 18 horas

  filter(msleep, between(sleep_total,16,18))
## # A tibble: 4 x 11
##   name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##   <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
## 1 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
## 2 Long~ Dasy~ carni Cing~ lc                  17.4       3.1       0.383   6.6
## 3 Nort~ Dide~ omni  Dide~ lc                  18         4.9       0.333   6  
## 4 Arct~ Sper~ herbi Rode~ lc                  16.6      NA        NA       7.4
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

3: mutate()

La función mutate nos permite crear nuevas columnas que contengan cálculos a partir de las que ya tenemos o generar nuevas columnas.

Por ejemplo, podemos generar una nueva columna llamada “rem_proportion” con la propoción de sueño rem entre las horas de sueño total

mutate(msleep, rem_proportion = sleep_rem / sleep_total)
## # A tibble: 83 x 12
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 3 more variables: brainwt <dbl>, bodywt <dbl>,
## #   rem_proportion <dbl>

De igual manera se pueden generar diversas nuevas columnas, separadas por comas.

mutate(msleep,rem_proportion = sleep_rem / sleep_total,
       bodywt_gram = bodywt * 1000)
## # A tibble: 83 x 13
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 4 more variables: brainwt <dbl>, bodywt <dbl>,
## #   rem_proportion <dbl>, bodywt_gram <dbl>

con mutate, tambien es posible cambiar el tipo de dato de cada columna. Por ejemplo, cambiar la columna “order” de caracter a factor:

order_fct <- mutate(msleep, order = factor(order))
order_fct
## # A tibble: 83 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <fct> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

Si vemos el tipo de datos, veremos la diferencia:

str(order_fct)
## tibble [83 x 11] (S3: tbl_df/tbl/data.frame)
##  $ name        : chr [1:83] "Cheetah" "Owl monkey" "Mountain beaver" "Greater short-tailed shrew" ...
##  $ genus       : chr [1:83] "Acinonyx" "Aotus" "Aplodontia" "Blarina" ...
##  $ vore        : chr [1:83] "carni" "omni" "herbi" "omni" ...
##  $ order       : Factor w/ 19 levels "Afrosoricida",..: 3 15 17 19 2 14 3 17 3 2 ...
##  $ conservation: chr [1:83] "lc" NA "nt" "lc" ...
##  $ sleep_total : num [1:83] 12.1 17 14.4 14.9 4 14.4 8.7 7 10.1 3 ...
##  $ sleep_rem   : num [1:83] NA 1.8 2.4 2.3 0.7 2.2 1.4 NA 2.9 NA ...
##  $ sleep_cycle : num [1:83] NA NA NA 0.133 0.667 ...
##  $ awake       : num [1:83] 11.9 7 9.6 9.1 20 9.6 15.3 17 13.9 21 ...
##  $ brainwt     : num [1:83] NA 0.0155 NA 0.00029 0.423 NA NA NA 0.07 0.0982 ...
##  $ bodywt      : num [1:83] 50 0.48 1.35 0.019 600 ...

4: arrange()

La función arrange nos permite order los datos en función a los valores de otra variable

Si queremos mostrar ordenados de menor a mayor los valores de nuestro conjunto de datos en función al numero de horas de sueño total:

arrange(msleep, sleep_total)
## # A tibble: 83 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Gira~ Gira~ herbi Arti~ cd                   1.9       0.4      NA      22.1
##  2 Pilo~ Glob~ carni Ceta~ cd                   2.7       0.1      NA      21.4
##  3 Horse Equus herbi Peri~ domesticated         2.9       0.6       1      21.1
##  4 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
##  5 Donk~ Equus herbi Peri~ domesticated         3.1       0.4      NA      20.9
##  6 Afri~ Loxo~ herbi Prob~ vu                   3.3      NA        NA      20.7
##  7 Casp~ Phoca carni Carn~ vu                   3.5       0.4      NA      20.5
##  8 Sheep Ovis  herbi Arti~ domesticated         3.8       0.6      NA      20.2
##  9 Asia~ Elep~ herbi Prob~ en                   3.9      NA        NA      20.1
## 10 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

Este ordenara los datos de menor a mayor, si se quiere ordenar de mayor a menor se debe agregar el operador -

arrange(msleep, desc(sleep_total))
## # A tibble: 83 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Litt~ Myot~ inse~ Chir~ <NA>                19.9       2         0.2     4.1
##  2 Big ~ Epte~ inse~ Chir~ lc                  19.7       3.9       0.117   4.3
##  3 Thic~ Lutr~ carni Dide~ lc                  19.4       6.6      NA       4.6
##  4 Gian~ Prio~ inse~ Cing~ en                  18.1       6.1      NA       5.9
##  5 Nort~ Dide~ omni  Dide~ lc                  18         4.9       0.333   6  
##  6 Long~ Dasy~ carni Cing~ lc                  17.4       3.1       0.383   6.6
##  7 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  8 Arct~ Sper~ herbi Rode~ lc                  16.6      NA        NA       7.4
##  9 Gold~ Sper~ herbi Rode~ lc                  15.9       3        NA       8.1
## 10 Tiger Pant~ carni Carn~ en                  15.8      NA        NA       8.2
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

Tambien es posible order caracteres

arrange(msleep, order)
## # A tibble: 83 x 11
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Tenr~ Tenr~ omni  Afro~ <NA>                15.6       2.3      NA       8.4
##  2 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  3 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
##  4 Goat  Capri herbi Arti~ lc                   5.3       0.6      NA      18.7
##  5 Gira~ Gira~ herbi Arti~ cd                   1.9       0.4      NA      22.1
##  6 Sheep Ovis  herbi Arti~ domesticated         3.8       0.6      NA      20.2
##  7 Pig   Sus   omni  Arti~ domesticated         9.1       2.4       0.5    14.9
##  8 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  9 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
## 10 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

5: pipes %>%

El operador %>% nos permite encadenar funciones sin tener que ir creando vartiables para uso temporal o sin tener que anidar funciones.

Dplyr importa este operador de otro paquete (magrittr). De manera general, el operador permite unir el resultado de una función a la entrada de otra función.

Por ejemplo, este script:

head(select(msleep, name, sleep_total))
## # A tibble: 6 x 2
##   name                       sleep_total
##   <chr>                            <dbl>
## 1 Cheetah                           12.1
## 2 Owl monkey                        17  
## 3 Mountain beaver                   14.4
## 4 Greater short-tailed shrew        14.9
## 5 Cow                                4  
## 6 Three-toed sloth                  14.4

Lo podemos reescribir de la siguiente manera:

msleep %>%
  select(name, sleep_total) %>%
  head
## # A tibble: 6 x 2
##   name                       sleep_total
##   <chr>                            <dbl>
## 1 Cheetah                           12.1
## 2 Owl monkey                        17  
## 3 Mountain beaver                   14.4
## 4 Greater short-tailed shrew        14.9
## 5 Cow                                4  
## 6 Three-toed sloth                  14.4

De esta manera podemos unir varias funciones en una sola cadena. Por ejemplo, para seleccionar columnas y dentro de estas, ordenar los ordenes

msleep %>%
  select(name, order, sleep_total) %>%
  arrange(order, sleep_total) %>%
  head
## # A tibble: 6 x 3
##   name     order        sleep_total
##   <chr>    <chr>              <dbl>
## 1 Tenrec   Afrosoricida        15.6
## 2 Giraffe  Artiodactyla         1.9
## 3 Roe deer Artiodactyla         3  
## 4 Sheep    Artiodactyla         3.8
## 5 Cow      Artiodactyla         4  
## 6 Goat     Artiodactyla         5.3

Los resultados de una cadena pueden asignarse a un nuevo objeto.

msleep_16h <- msleep %>%
  select(name, order, sleep_total) %>%
  arrange(order, sleep_total) %>%
  filter(sleep_total > 16)

msleep_16h
## # A tibble: 8 x 3
##   name                   order           sleep_total
##   <chr>                  <chr>                 <dbl>
## 1 Big brown bat          Chiroptera             19.7
## 2 Little brown bat       Chiroptera             19.9
## 3 Long-nosed armadillo   Cingulata              17.4
## 4 Giant armadillo        Cingulata              18.1
## 5 North American Opossum Didelphimorphia        18  
## 6 Thick-tailed opposum   Didelphimorphia        19.4
## 7 Owl monkey             Primates               17  
## 8 Arctic ground squirrel Rodentia               16.6

Ejercicio 1: Crea una nueva tabla que contenga:

  1. una columna llamada rem_ratio con la proporción de horas rem / horas total
  2. seleccionando solamente las columnas “name”, “order” y “rem_ratio”
  3. filtrando las especies con una rem_ratio > 0.25
  4. ordenados de forma descendente.

Ejercicio 2: Crea una nueva tabla que contenga:

  1. los valores de bodywt y brainwt en gr (sin generar columnas nuevas)
  2. una columna con la proporcion brainwt sobre bodywt, la que llamaremos brain_body_r
  3. solamente las columnas “name”, “order” y “brain_body_r”
  4. los valores de brain_body_r en forma descendente
  5. los primeros 10 valores de bain_body_r
msleep %>%
  mutate(brainwt = brainwt * 1000) %>%
  mutate(bodywt = bodywt * 1000) %>%
  mutate(brain_body_r = brainwt/bodywt) %>%
  select(name, order, brain_body_r)%>%
  arrange(desc(brain_body_r)) %>%
  slice(1:10) #head(); #top_n

6: summarise()

La función summarise() nos permite crear resúmenes estadísticos para nuestrs datos a partir de una determinada columna. Para esto, podemos usar las funciones ya conocidas, tales como mean(), min(), max(), sd(),n(). Por ejemplo

msleep %>%
  summarise(promedio = mean(sleep_total),
            minimo = min(sleep_total),
            maximo = max(sleep_total),
            N = n())
## # A tibble: 1 x 4
##   promedio minimo maximo     N
##      <dbl>  <dbl>  <dbl> <int>
## 1     10.4    1.9   19.9    83

7: Operaciones de grupo usando group_by()

El verbo group_by() permite “separar” agrupar la tabla en función a una variable y aplicar la funcion summarise().

msleep %>%
  group_by(order) %>%
  summarise(promedio = mean(sleep_total),
            desvest = sd(sleep_total),
            N = n())
## # A tibble: 19 x 4
##    order           promedio desvest     N
##    <chr>              <dbl>   <dbl> <int>
##  1 Afrosoricida       15.6  NaN         1
##  2 Artiodactyla        4.52   2.51      6
##  3 Carnivora          10.1    3.50     12
##  4 Cetacea             4.5    1.57      3
##  5 Chiroptera         19.8    0.141     2
##  6 Cingulata          17.8    0.495     2
##  7 Didelphimorphia    18.7    0.990     2
##  8 Diprotodontia      12.4    1.84      2
##  9 Erinaceomorpha     10.2    0.141     2
## 10 Hyracoidea          5.67   0.551     3
## 11 Lagomorpha          8.4  NaN         1
## 12 Monotremata         8.6  NaN         1
## 13 Perissodactyla      3.47   0.814     3
## 14 Pilosa             14.4  NaN         1
## 15 Primates           10.5    2.21     12
## 16 Proboscidea         3.6    0.424     2
## 17 Rodentia           12.5    2.81     22
## 18 Scandentia          8.9  NaN         1
## 19 Soricomorpha       11.1    2.70      5

8:summarise_all()

La función summarise_all() requiere una función como argumento, la cual aplica a todas las columnas de la tabla. En este ejemplo se agrego el argumento na.rm = TRUE el cual ignora los NAs

msleep %>%
  group_by(vore) %>%
  summarise_all(mean, na.rm =TRUE)
## # A tibble: 5 x 11
##   vore   name genus order conservation sleep_total sleep_rem sleep_cycle awake
##   <chr> <dbl> <dbl> <dbl>        <dbl>       <dbl>     <dbl>       <dbl> <dbl>
## 1 carni    NA    NA    NA           NA       10.4       2.29       0.373 13.6 
## 2 herbi    NA    NA    NA           NA        9.51      1.37       0.418 14.5 
## 3 inse~    NA    NA    NA           NA       14.9       3.52       0.161  9.06
## 4 omni     NA    NA    NA           NA       10.9       1.96       0.592 13.1 
## 5 <NA>     NA    NA    NA           NA       10.2       1.88       0.183 13.8 
## # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

Ejercicio 3:¨Calcula el promedio de todas las variables relacionadas con las horas de sueño (“sleep_total”, “sleep_rem”, “sleep_cycle”).

Ejercicio 4 Activida de LDH: Usando los valores de actividad enzimática que se encuentran en el directorio data/:

  1. abre cada uno y unelos en una sola tabla (como en el ejercicio anterio)
  2. convierte esta nueva table en tible
  3. selecciona las columnas ExpNum,TreatTemp, Meas_Temp y ActivityLDH
  4. convierte la columna ExpNum en factores
  5. agrupa la tabla de acuerdo a esta columna
  6. calcula el promedio, desviación estandar y N para los valores de activtidad de LDH
  7. guarda esta nueva tabla en el directorio data_editado

9: count()

La función count() nos permite saber cuantas observaciones hay en una variable especifica. Al agregar el argumento sort = TRUEdevuelve una tabla descendiente con el número de observaciones.

Por ejemplo, para saber cuantos miembros de cada ordern hay en nuestra lista de especies:

msleep %>%
  count(order, sort = TRUE)
## # A tibble: 19 x 2
##    order               n
##    <chr>           <int>
##  1 Rodentia           22
##  2 Carnivora          12
##  3 Primates           12
##  4 Artiodactyla        6
##  5 Soricomorpha        5
##  6 Cetacea             3
##  7 Hyracoidea          3
##  8 Perissodactyla      3
##  9 Chiroptera          2
## 10 Cingulata           2
## 11 Didelphimorphia     2
## 12 Diprotodontia       2
## 13 Erinaceomorpha      2
## 14 Proboscidea         2
## 15 Afrosoricida        1
## 16 Lagomorpha          1
## 17 Monotremata         1
## 18 Pilosa              1
## 19 Scandentia          1

o el número de especies en X estatus de proteccion

msleep %>%
  count(conservation, sort =TRUE)
## # A tibble: 7 x 2
##   conservation     n
##   <chr>        <int>
## 1 <NA>            29
## 2 lc              27
## 3 domesticated    10
## 4 vu               7
## 5 en               4
## 6 nt               4
## 7 cd               2

10: unir datos con dplyr

Ahora vamos a importar la pesteña movement del mismo archivo excel para explorar algunas funciones adicionales de dplyr

movement <- read_excel("data/msleep_database_excel.xls", sheet = "movement", na = "NA")
movement
## # A tibble: 92 x 4
##    name                       habitat displacement speed
##    <chr>                      <chr>   <chr>        <dbl>
##  1 Cheetah                    land    run_fast         8
##  2 Owl monkey                 land    run_fast        10
##  3 Mountain beaver            land    run_slow         1
##  4 Greater short-tailed shrew land    run_slow         3
##  5 Cow                        land    run_slow         3
##  6 Three-toed sloth           land    run_slow         2
##  7 Northern fur seal          sea     swimm_fast       9
##  8 Vesper mouse               land    run_fast        10
##  9 Dog                        land    run_fast         1
## 10 Roe deer                   land    run_fast         7
## # ... with 82 more rows

Como puedes ver, esta tabla contiene tambien la columna name con los nombres de las mismas especies que msleep, pero con información adicional. Ademas, esta tabla contiene algunas especies que no estan en la lista de msleep.

Utilizando dplyr es posible unir ambas tablas usando:

  • inner_join()
  • left_join()
  • full_join()
  • anti_join()

Con inner_join() se genera una nueva tabla que combina la tabla A con la tabla B basado en una variable de union by=, que en este caso es name

inner_join(msleep, movement, by="name")
## # A tibble: 83 x 14
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 5 more variables: brainwt <dbl>, bodywt <dbl>,
## #   habitat <chr>, displacement <chr>, speed <dbl>

tambien es posible agregar esta función a una cadena:

msleep %>%
  inner_join(movement, by="name")
## # A tibble: 83 x 14
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 5 more variables: brainwt <dbl>, bodywt <dbl>,
## #   habitat <chr>, displacement <chr>, speed <dbl>

con left_join() se utilizaran los valores especificados como “left” (la primera) y los unira con los datos de la tabla “right” (segunda). **Si no hay una union (match) en la segunda tabla, entonces regresara NULL.

por ejemplo, si usamos msleep como el left, y movement como right, nos regresa una tabla similar a usar inner_join():

left_join(msleep, movement, by="name")
## # A tibble: 83 x 14
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 5 more variables: brainwt <dbl>, bodywt <dbl>,
## #   habitat <chr>, displacement <chr>, speed <dbl>

pero si usamos movement como left, entonces

left_join(movement, msleep, by = "name")
## # A tibble: 92 x 14
##    name  habitat displacement speed genus vore  order conservation sleep_total
##    <chr> <chr>   <chr>        <dbl> <chr> <chr> <chr> <chr>              <dbl>
##  1 Chee~ land    run_fast         8 Acin~ carni Carn~ lc                  12.1
##  2 Owl ~ land    run_fast        10 Aotus omni  Prim~ <NA>                17  
##  3 Moun~ land    run_slow         1 Aplo~ herbi Rode~ nt                  14.4
##  4 Grea~ land    run_slow         3 Blar~ omni  Sori~ lc                  14.9
##  5 Cow   land    run_slow         3 Bos   herbi Arti~ domesticated         4  
##  6 Thre~ land    run_slow         2 Brad~ herbi Pilo~ <NA>                14.4
##  7 Nort~ sea     swimm_fast       9 Call~ carni Carn~ vu                   8.7
##  8 Vesp~ land    run_fast        10 Calo~ <NA>  Rode~ <NA>                 7  
##  9 Dog   land    run_fast         1 Canis carni Carn~ domesticated        10.1
## 10 Roe ~ land    run_fast         7 Capr~ herbi Arti~ lc                   3  
## # ... with 82 more rows, and 5 more variables: sleep_rem <dbl>,
## #   sleep_cycle <dbl>, awake <dbl>, brainwt <dbl>, bodywt <dbl>

de igual manera, esto se puede expresar en una cadena:

movement %>%
  left_join(msleep, by ="name")
## # A tibble: 92 x 14
##    name  habitat displacement speed genus vore  order conservation sleep_total
##    <chr> <chr>   <chr>        <dbl> <chr> <chr> <chr> <chr>              <dbl>
##  1 Chee~ land    run_fast         8 Acin~ carni Carn~ lc                  12.1
##  2 Owl ~ land    run_fast        10 Aotus omni  Prim~ <NA>                17  
##  3 Moun~ land    run_slow         1 Aplo~ herbi Rode~ nt                  14.4
##  4 Grea~ land    run_slow         3 Blar~ omni  Sori~ lc                  14.9
##  5 Cow   land    run_slow         3 Bos   herbi Arti~ domesticated         4  
##  6 Thre~ land    run_slow         2 Brad~ herbi Pilo~ <NA>                14.4
##  7 Nort~ sea     swimm_fast       9 Call~ carni Carn~ vu                   8.7
##  8 Vesp~ land    run_fast        10 Calo~ <NA>  Rode~ <NA>                 7  
##  9 Dog   land    run_fast         1 Canis carni Carn~ domesticated        10.1
## 10 Roe ~ land    run_fast         7 Capr~ herbi Arti~ lc                   3  
## # ... with 82 more rows, and 5 more variables: sleep_rem <dbl>,
## #   sleep_cycle <dbl>, awake <dbl>, brainwt <dbl>, bodywt <dbl>

la función full_join() realiza una funcion similar a left_join() pero es indistinto cual table es izquiera o derecha:

full_join(msleep, movement, by="name")
## # A tibble: 92 x 14
##    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Chee~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe ~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 82 more rows, and 5 more variables: brainwt <dbl>, bodywt <dbl>,
## #   habitat <chr>, displacement <chr>, speed <dbl>

la función anti_join() nos da los valores que no tienen match entre ambas tablas. Esta nueva tabla solo contien los valores de la primera tabla

anti_join(movement, msleep, by="name")
## # A tibble: 9 x 4
##   name        habitat displacement speed
##   <chr>       <chr>   <chr>        <dbl>
## 1 polar bear  land    run_fast      15  
## 2 pikachu     land    run_slow       3  
## 3 red abalone sea     crawl_slow     0.1
## 4 sea star    sea     crawl_slow     0.2
## 5 scallop     sea     swimm_slow     1  
## 6 sea gull    air     fly_fast       7  
## 7 vulture     air     fly_fast       8  
## 8 eagle       air     fly_fast      10  
## 9 white shark sea     swimm_fast    30

11: separate()

Por ultimo, vamos a separar una cadena de caracteres con un patron regular. En este caso, la columna displacementcontiene el tipo de desplazamiento y la velocidad separada por un "_".

Para esto, tenemos que instalar y cargar en nuestro ambiente el paquete tidyr y usar la función separate:

library(tidyr)

movement %>%
  separate(displacement, into = c("type", "velocity"))
## # A tibble: 92 x 5
##    name                       habitat type  velocity speed
##    <chr>                      <chr>   <chr> <chr>    <dbl>
##  1 Cheetah                    land    run   fast         8
##  2 Owl monkey                 land    run   fast        10
##  3 Mountain beaver            land    run   slow         1
##  4 Greater short-tailed shrew land    run   slow         3
##  5 Cow                        land    run   slow         3
##  6 Three-toed sloth           land    run   slow         2
##  7 Northern fur seal          sea     swimm fast         9
##  8 Vesper mouse               land    run   fast        10
##  9 Dog                        land    run   fast         1
## 10 Roe deer                   land    run   fast         7
## # ... with 82 more rows

12:unite()

Esta función realiza lo opuesto a la anterior y nos permite unir dos variables en una sola. Por ejemplo, unir el nombre de la especie con el genero

msleep %>%
  unite(name_genus,name, genus, sep = ":")
## # A tibble: 83 x 10
##    name_genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
##    <chr>      <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
##  1 Cheetah:A~ carni Carn~ lc                  12.1      NA        NA      11.9
##  2 Owl monke~ omni  Prim~ <NA>                17         1.8      NA       7  
##  3 Mountain ~ herbi Rode~ nt                  14.4       2.4      NA       9.6
##  4 Greater s~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
##  5 Cow:Bos    herbi Arti~ domesticated         4         0.7       0.667  20  
##  6 Three-toe~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
##  7 Northern ~ carni Carn~ vu                   8.7       1.4       0.383  15.3
##  8 Vesper mo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
##  9 Dog:Canis  carni Carn~ domesticated        10.1       2.9       0.333  13.9
## 10 Roe deer:~ herbi Arti~ lc                   3        NA        NA      21  
## # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

Ejercicio 5: Dentro de la carpeta de data/se colocaron dos archivos relacionados con un análisis transcriptómico, el cual contiene una lista de genes expresados diferencialmente (Transcriptome_DGE) y una lista de genes anotados (Transcriptome_Anotacion). Con esto se va quiere hacer lo siguiente:

  1. Importar ambas tablas usando read_excel() y explorar el contenido de ambas tablas
  2. De la tabla de anotaciones, mostrar los primeros 20 generos con mayor frecuencia
  3. Crear una nueva tabla llamada DGE_anotados, en donde se una la anotación de cada transcrito a su valor de expresión y filtrar aquellos transcritos que tengan una expresion (logFC) menor a -4 y mayor a 4. Pista: recuerda que puedes usar el operador !
  4. A partir de la tabla generada en 3, crea una nueva tabla que contenga las variables en el siguiente orden:
  • transcript
  • name
  • logFC
  • FDR
  • uniprot (sin el identificador de especie).

13: Reordenar una tabla con tydr

tidyr es un paquete que fue construido con el proposito de crear bases de datos en un formato mas “tidy”.

¿que es el formato tidy?

En este curso, nos enfocaremos a las funciones:

  • gather(): convierte a formato ancho “wide”.
  • spread(): convierte a formato largo “long”.
  • separate(): separa una columna en multiples columnas.
  • unite(): une o combine multiples columnas en una sola.

imagen original: http://www.sthda.com/english/wiki/tidyr-crucial-step-reshaping-data-with-r-for-easier-analyses

14: gather() y spread()

Para entender la diferencia entre el formato ancho y largo, usemos la siguiente tabla con los datos de consumo de oxígeno de 10 individuos a lo largo de seis días:

MO2 <- read.csv("data/Consumo_oxigeno_wide.csv")
MO2 <- as_tibble(MO2)
MO2
## # A tibble: 10 x 7
##    individuo  dia1  dia2  dia3  dia4  dia5  dia6
##    <fct>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 E1        11.7  46.6   8.10 18.7   59.6  47.5
##  2 E2        12.7   8.95 15.2  31.8   30.3  30.4
##  3 E3        14.5  27.2  11.9  29.3   42.2  40.5
##  4 E4        27.6  29.5  17.1  30.1   61.2  63.0
##  5 E5         7.70 29.7  19.0  31.8   71.0  42.7
##  6 E6         6.64 34.8  14.3   5.18  61.6  65.1
##  7 E7        10.4  36.3   9.66 24.1   60.6  65.4
##  8 E8        14.5  40.1   8.11 33.6   18.5  59.4
##  9 E9         5.62 48.8  14.5  10.4   21.0  52.4
## 10 E10        6.97 14.6  NA    NA     NA    45.2

En este caso, los individuos estan en filas y cada dia en una columna diferentes. Para transformar en formato largo, usando la funcion gather()

MO2_tall = MO2 %>%
  gather(key = dia, value = MO2, -individuo)

MO2_tall
## # A tibble: 60 x 3
##    individuo dia     MO2
##    <fct>     <chr> <dbl>
##  1 E1        dia1  11.7 
##  2 E2        dia1  12.7 
##  3 E3        dia1  14.5 
##  4 E4        dia1  27.6 
##  5 E5        dia1   7.70
##  6 E6        dia1   6.64
##  7 E7        dia1  10.4 
##  8 E8        dia1  14.5 
##  9 E9        dia1   5.62
## 10 E10       dia1   6.97
## # ... with 50 more rows

En donde key corresponde a la columna representanto a la nueva variable, value corresponde a la columna con los valores y el último parametro corresponde a la columna a agrupar o no agrupar

Por el contrario, podemos usar spread()para realizar la operación opuesta

MO2_wide = MO2_tall %>%
  spread(key = dia, value = MO2)
MO2_wide
## # A tibble: 10 x 7
##    individuo  dia1  dia2  dia3  dia4  dia5  dia6
##    <fct>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 E1        11.7  46.6   8.10 18.7   59.6  47.5
##  2 E10        6.97 14.6  NA    NA     NA    45.2
##  3 E2        12.7   8.95 15.2  31.8   30.3  30.4
##  4 E3        14.5  27.2  11.9  29.3   42.2  40.5
##  5 E4        27.6  29.5  17.1  30.1   61.2  63.0
##  6 E5         7.70 29.7  19.0  31.8   71.0  42.7
##  7 E6         6.64 34.8  14.3   5.18  61.6  65.1
##  8 E7        10.4  36.3   9.66 24.1   60.6  65.4
##  9 E8        14.5  40.1   8.11 33.6   18.5  59.4
## 10 E9         5.62 48.8  14.5  10.4   21.0  52.4

15: Tidyverse

Hasta ahora hemos visto dos paquetes, dplyr y tidyr las cuales son muy similares en su uso y permiten integrar diversas funciones en el mismo flujo de trabajo.

Esta filosofía impusó el desarrollo de Tidyverse, el cual es un conjunto de paquetes que interactuan entre ellos permitiendo un flujo de trabajo eficiente.

Para usar Tidyverse, simplemente installa el paquete y al cargar la libreria, se cargaran todos los paquetes necesarios, entre ellos:

  • dplyr
  • tidyr
  • ggplot2
  • reader*

*Reader permite abrir datos de manera analoga a read.table() o read.csv() pero abre los datos directamente como tibbles. La forma de usarlos es:

  • read_table()
  • read_csv()
  • read_delim()

fuera de eso, la sintaxis es igual al de las funciones base de R.

Nota: El paquete readxl no forma parte formalmente de tidyverse, pero se une al flujo de trabajo.