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: ```
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:
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 caracterescontains()
= 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>
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>
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 ...
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>
%>%
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:
rem_ratio
con la proporción de horas rem / horas totalEjercicio 2: Crea una nueva tabla que contenga:
brain_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
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
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
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/
:
ExpNum
,TreatTemp
, Meas_Temp
y ActivityLDH
ExpNum
en factoresdata_editado
count()
La función count()
nos permite saber cuantas observaciones hay en una variable especifica. Al agregar el argumento sort = TRUE
devuelve 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
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
separate()
Por ultimo, vamos a separar una cadena de caracteres con un patron regular. En este caso, la columna displacement
contiene 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
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:
read_excel()
y explorar el contenido de ambas tablasDGE_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 !
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
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
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:
*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.