Last updated: 2021-05-16
Checks: 7 0
Knit directory: 2021/
This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.
Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.
Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.
The command set.seed(20210412)
was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.
Great job! Recording the operating system, R version, and package versions is critical for reproducibility.
Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.
Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.
Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.
The results in this page were generated with repository version 29cdc5f. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.
Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish
or wflow_git_commit
). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:
Ignored files:
Ignored: .Rhistory
Ignored: .Rproj.user/
Untracked files:
Untracked: Curso_Bioestadistica_MTripp_cuatriII.docx
Untracked: Curso_Bioestadistica_MTripp_cuatriII.pdf
Untracked: Diapositivas/
Untracked: README.html
Untracked: Resources/
Untracked: analysis/images/
Untracked: data/Consumo_oxigeno_wide.csv
Untracked: data/Data_enzimas_Experimento1.txt
Untracked: data/Data_enzimas_Experimento2.txt
Untracked: data/Data_enzimas_Experimento3.txt
Untracked: data/Data_enzimas_Experimento4.txt
Untracked: data/Tabla1_Muestreo.txt
Untracked: data/Transcriptome_Anotacion.csv
Untracked: data/Transcriptome_DGE.csv
Untracked: data/datasets_Pokemon.csv
Untracked: data/datasets_Pokemon.xls
Untracked: data/penguins_size.csv
Untracked: data/pokemon_extended.csv
Untracked: output/Plot_all_penguins.pdf
Untracked: output/Plot_all_penguins.tiff
Untracked: output/graficos/
Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.
These are the previous versions of the repository in which changes were made to the R Markdown (analysis/Clase2_Data_Frames.Rmd
) and HTML (docs/Clase2_Data_Frames.html
) files. If you’ve configured a remote Git repository (see ?wflow_git_remote
), click on the hyperlinks in the table below to view the files as they were in that past version.
File | Version | Author | Date | Message |
---|---|---|---|---|
html | b1ca7f3 | Miguel Tripp | 2021-05-16 | Build site. |
html | b3002cc | Miguel Tripp | 2021-05-04 | Build site. |
html | 2c60db3 | Miguel Tripp | 2021-05-04 | Build site. |
html | 65fa0ee | Miguel Tripp | 2021-05-04 | Build site. |
html | b3c3d89 | Miguel Tripp | 2021-04-26 | Build site. |
html | 195c2e9 | Miguel Tripp | 2021-04-25 | Build site. |
html | e322dac | Miguel Tripp | 2021-04-25 | Build site. |
Rmd | 7d0111c | Miguel Tripp | 2021-04-25 | Publish the initial files for myproject |
html | b237a5e | Miguel Tripp | 2021-04-22 | Build site. |
Rmd | cd132b5 | Miguel Tripp | 2021-04-22 | Publish the initial files for myproject |
html | 4c3c22d | Miguel Tripp | 2021-04-20 | Build site. |
Rmd | 43a6b26 | Miguel Tripp | 2021-04-20 | Publish the initial files for myproject |
html | 945bc0f | Miguel Tripp | 2021-04-18 | Build site. |
html | 527e486 | Miguel Tripp | 2021-04-18 | Build site. |
html | cddaa8a | Miguel Tripp | 2021-04-18 | Build site. |
html | 02e6728 | Miguel Tripp | 2021-04-18 | Build site. |
html | 2af07d8 | Miguel Tripp | 2021-04-18 | Build site. |
Rmd | f24eb8f | Miguel Tripp | 2021-04-18 | Publish the initial files for myproject |
Los data frames son estructuras de datos de dos dimensiones que pueden contener datos de diferentes tipos, por lo tanto, son heterogeneas. En terminos generales, los renglones de una data.frame representan casos, individuos u observaciones, mientras que las columnas contiene datos de un solo tipo.
Genera un data.frame con los siguientes elementos:
Nombre <- c("Alex", "Lilly", "Mark", "Oliver", "Martha", "Lucas", "Caroline")
Edad <- c(25, 31, 23, 52, 76, 49, 26)
Altura <- c(177, 163, 190, 179, 163, 183, 164)
Peso <- c(57, 69, 83, 75, 70, 83, 53)
Sexo <- as.factor(c("M", "M", "H", "H", "M", "H", "M"))
df <- data.frame (row.names = Nombre, Edad, Altura, Peso, Sexo)
Esto nos produce la tabla
df
Edad Altura Peso Sexo
Alex 25 177 57 M
Lilly 31 163 69 M
Mark 23 190 83 H
Oliver 52 179 75 H
Martha 76 163 70 M
Lucas 49 183 83 H
Caroline 26 164 53 M
Acceder a las variables del data.frame:
Utilizando el symbolo $
.
Utilizando indices [F, C]
.
para obtener los pesos:
df$Peso
[1] 57 69 83 75 70 83 53
Para obtener las edades
df[,2]
[1] 177 163 190 179 163 183 164
Otra opción:
df[, "Edad"]
[1] 25 31 23 52 76 49 26
Ejercicio: ¿como puedo acceder a toda la información de Mark?
df["Mark",]
Edad Altura Peso Sexo
Mark 23 190 83 H
*Para que esto funcione, nuestra tabla tiene que tener colnames y rownames
Ahora, deseamos agregar una columna trabajo
con la siguiente información
Nombre | Trabaja |
---|---|
Alex | si |
Lilly | no |
Mark | no |
Oliver | si |
Martha | si |
Lucas | no |
Caroline | si |
En la clase anterior, vimos que se puede agregar una columna nueva usando el operador $
.
Otra forma de agregar elementos nuevos a una tabla es mediante el uso de cbind
y rbind
.
Trabajo <- c("si","no","no","si","si","no","si")
df2 <- data.frame(row.names = Nombre,Trabajo)
df2
Ahora añade esta nueva columna a df.
df_bind <- cbind(df, df2)
Verificar las dimensiones de la tabla con dim()
dim(df)
[1] 7 4
dim(df2)
[1] 7 1
dim(df_bind)
[1] 7 5
Las matrices y arrays pueden ser definidos como vectores multidimencionales. Especificamente las matrices poseen dos dimensiones y unicamente pueden contener datos de un solo tipo.
Para crear una matriz se usa la función matrix()
, la cual usa los argumentos nrow
y ncol
. Con ellos se especifica el número de renglones y columnas que tendrá nuestra matriz.
#matriz sin especificar renglones ni columnas
matrix(1:12)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
[11,] 11
[12,] 12
Ahora usamos la misma serie de números pero definiendo 3 filas y 4 columnas
matrix(1:12, nrow = 3, ncol = 4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
Ahora usando la misma serie de números pero con 4 filas y 3 columnas
matrix(1:12, nrow = 4, ncol = 3)
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
Al igual que como lo vimos con las data frame, es posible unir vectores con las funciones:
cbind()
rbind()
De este modo podemos generar una matriz a partir de varios vectores
vec1 <- 1:4
vec2 <- 5:8
vec3 <- 9:12
vec4 <- 13:16
Ahora une los vectores usando rbind
y cbind
. ¿cual es la diferencia?
Genera los siguientes vectores:
vec1 <- 1:2
vec2 <- 1:3
vec3 <- 1:5
Trata de unir los vectores como en el ejercicio anterior. ¿cual es la diferencia?
Para convertir una matriz a data frame, se usa la función as.data.frame()
mientras que para el caso contrario se usa as.matrix()
. Es importante tomar en cuenta la naturaleza de cada estructura: las matrices solo aceptan un solo tipo de dato
Por ejeplo, tenemos la matriz:
matriz <- matrix(1:12, 3,4)
matriz
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
se convierte a data.frame
matriz_df <- as.data.frame(matriz)
matriz_df
V1 V2 V3 V4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
Ahora trataremos de convertir la tabla df_bind a una matriz.
df_matriz <- as.matrix(df_bind)
df_matriz
Edad Altura Peso Sexo Trabajo
Alex "25" "177" "57" "M" "si"
Lilly "31" "163" "69" "M" "no"
Mark "23" "190" "83" "H" "no"
Oliver "52" "179" "75" "H" "si"
Martha "76" "163" "70" "M" "si"
Lucas "49" "183" "83" "H" "no"
Caroline "26" "164" "53" "M" "si"
¿que tipo de dato contiene la matriz?
¿como podemos generar una matriz solamente con datos númericos?
son similares a las matrices pero pueden contener 2 o mas dimensiones
arreglo <- array(1:24, dim = c(2,3,4))
arreglo
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
Regresando a nuestra tabla df_bind, despliega la columna de "Sexo:
df_bind$Sexo
[1] M M H H M H M
Levels: H M
Los factores, son vectores que contienen información categorica la cual es de utilidad para agrupar los valores de la data frame.
Nota Para hacer cambios puntuales a una tabla se puede usar la función fix()
.
R posee el poderoso concepto de directorio de trabajo (working directory en inglés). Aquí es donde R busca los archivos que le pides que lea y donde colocará todos los archivos que le pidas que guarde. RStudio muestra tu directorio de trabajo actual en la parte superior de la consola.
Puedes imprimir esto en código de R ejecutando el comando getwd()
(en inglés get working directory, que significa obtener directorio de trabajo):
getwd()
Pero también es posible definir el directorio de trabajo desde R:
setwd("data/")
Ahora, nuuestro directorio de trabajo es ~/data
, por lo que cualquier cosa que guardemos, se hara en este directorio.
Ahora regresemos a nuestro directorio principal y lo definimos nuevamente como nuestro directorio de trabajo; esto tambien se puede realizar directamente desde la ventana de Rstudio en more: Set as working directory
.
Usar proeyectos dentro de Rstudio soluciona el problema de rutas “fragiles”. Cuando estas trabajando dentro de un projecto (.Rproj), el directorio de trabajo corresponde al directorio raiz.
La forma mas sencilla de transferir datos hacia R es mediante un archivo sin formato (plain text). Estos puede ser:
Estos tipos de archivos son de gran utilidad ya que pueden ser leidos por na gran variedad de bases y paquetes estadisticos.
Para importar una base de datos a R se pueden utilizar la funcion read.table()
.
A continuación vamos a abrir un archivo de texto que esta dentro de la carpeta data
tabla <- read.table("data/Tabla1_Muestreo.txt", sep = "\t", header = TRUE)
Exploracdión general de los datos
usar la funcion head()
o tail
para tener una visualización de los datos
head(tabla)
Individuo Sitio Estacion Sexo Profundidad Longitud_mm
1 1 Bahia La Paz Verano H Superficie 30.27
2 2 Bahia La Paz Verano M Superficie 35.50
3 3 Bahia La Paz Verano H Superficie 30.36
4 4 Bahia La Paz Verano H Superficie 24.86
5 5 Bahia La Paz Verano M Superficie 31.81
6 6 Bahia La Paz Verano H Superficie 29.51
tail(tabla)
Individuo Sitio Estacion Sexo Profundidad Longitud_mm
139 139 Todos Santos Invierno H Fondo 16.12
140 140 Todos Santos Invierno H Fondo 30.14
141 141 Todos Santos Invierno H Fondo 6.20
142 142 Todos Santos Invierno H Fondo 23.01
143 143 Todos Santos Invierno H Fondo 19.09
144 144 Todos Santos Invierno M Fondo 18.12
Podemos ver la estructura de la tabla con la función str()
str(tabla)
'data.frame': 144 obs. of 6 variables:
$ Individuo : int 1 2 3 4 5 6 7 8 9 10 ...
$ Sitio : chr "Bahia La Paz" "Bahia La Paz" "Bahia La Paz" "Bahia La Paz" ...
$ Estacion : chr "Verano" "Verano" "Verano" "Verano" ...
$ Sexo : chr "H" "M" "H" "H" ...
$ Profundidad: chr "Superficie" "Superficie" "Superficie" "Superficie" ...
$ Longitud_mm: num 30.3 35.5 30.4 24.9 31.8 ...
Ademas podemos ver el resumen general de los datos con summary()
summary(tabla)
Individuo Sitio Estacion Sexo
Min. : 1.00 Length:144 Length:144 Length:144
1st Qu.: 36.75 Class :character Class :character Class :character
Median : 72.50 Mode :character Mode :character Mode :character
Mean : 72.50
3rd Qu.:108.25
Max. :144.00
Profundidad Longitud_mm
Length:144 Min. : 6.20
Class :character 1st Qu.:21.45
Mode :character Median :29.43
Mean :28.97
3rd Qu.:35.89
Max. :56.93
Ejercicio: Usando lo que vimos en la lección pasada: (1) calcula la longitud promedio de todas las estaciones. (2) crea un nuevo vector que contenga solamente las longitudes con el nombre de cada individuo.
Tambien es posible usar read.table
o read.csv
para abrir datos remotos usando la URL
url <- "https://raw.githubusercontent.com/trippv/Miguel_Tripp/master/Datos_metabolitos.csv"
metabolitos <- read.csv(url)
head(metabolitos)
ID Lipidos Carbohidratos Proteinas Valina Leucina Isoleucina
1 1 5.136842 5.421053 187.46842 0.6815789 9.634211 8.197368
2 2 3.592593 3.651852 224.55185 0.4703704 9.448148 6.777778
3 3 2.383673 4.306122 142.19796 0.7040816 6.228571 4.553061
4 4 7.003571 8.196429 479.80357 0.5964286 16.857143 16.450000
5 5 1.132143 2.407143 98.78571 0.4000000 5.946429 3.514286
6 6 3.268182 9.154545 408.42727 1.8818182 9.836364 13.377273
subset()
Cuando se tiene un set de datos bastante grande, resulta conveniente remover o filtrar aquellas variables innecesarias y arreglar el restos de las variables de manera práctica.
La función subset()
permite seleccionar un subset de datos que cumplen determinadas condiciones, mientras que select
permite definir cuales variables mantener.
De nuetra tabla, vamos a generar una nueva tabla que contenga solamente los individuos, sitios y longitudes.
tabla1 <- subset(tabla, select=c(Individuo, Sitio, Longitud_mm))
Ahora vamos a generar una nueva tabla que contenga solamente los individuos de verano
tabla_verano <- subset(tabla, Estacion == "Verano")
head(tabla_verano)
Individuo Sitio Estacion Sexo Profundidad Longitud_mm
1 1 Bahia La Paz Verano H Superficie 30.27
2 2 Bahia La Paz Verano M Superficie 35.50
3 3 Bahia La Paz Verano H Superficie 30.36
4 4 Bahia La Paz Verano H Superficie 24.86
5 5 Bahia La Paz Verano M Superficie 31.81
6 6 Bahia La Paz Verano H Superficie 29.51
Ejercicio: Crea una nueva tabla que contenga (1) solamente los organismos de superfice, (2) los individuos que tengan una longitud mayor al promedio total. ¿Cuantos individuos tienen una longitud mayor al promedio total?
Es posible seleccionar varios parametros simultaneamente usando el simbolor &
.
Por ejemplo: seleccionar a los individuos de superficie y verano
tabla_sup_ver <- subset(tabla, Estacion == "Verano" & Profundidad == "Superficie")
head(tabla_sup_ver)
Individuo Sitio Estacion Sexo Profundidad Longitud_mm
1 1 Bahia La Paz Verano H Superficie 30.27
2 2 Bahia La Paz Verano M Superficie 35.50
3 3 Bahia La Paz Verano H Superficie 30.36
4 4 Bahia La Paz Verano H Superficie 24.86
5 5 Bahia La Paz Verano M Superficie 31.81
6 6 Bahia La Paz Verano H Superficie 29.51
Ejercicio: Crea una nueva tabla que contenga los individuos que NO sean de Bahia de La Paz y que tengan una longitud mayor o igual a 20 mm.
Tambien es posible generar subsets de datos usando indicies []
. Recuerda que se aplica es mismo principio [filas, columnas].
Ahora queremos recrear la tabla tabla_verano. Primero verificamos cuales individuos tienen la etiqueta “Verano”:
tabla$Estacion == "Verano"
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[97] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[109] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Esto nos genera un vector con las filas que contienen la etiqueta (TRUE), con lo que podemos usar []
para fitrar las filas TRUE con todas las columnas
tabla_verano2 <- tabla[tabla$Estacion=="Verano", ]
head(tabla_verano2)
Individuo Sitio Estacion Sexo Profundidad Longitud_mm
1 1 Bahia La Paz Verano H Superficie 30.27
2 2 Bahia La Paz Verano M Superficie 35.50
3 3 Bahia La Paz Verano H Superficie 30.36
4 4 Bahia La Paz Verano H Superficie 24.86
5 5 Bahia La Paz Verano M Superficie 31.81
6 6 Bahia La Paz Verano H Superficie 29.51
Ejercicio Utilizando indices, genera un vector solamente con los valores de longitud de los indivuos de verano. Agrega las etiquetas de individuos
Ejercicio (1) ¿Cual individuo tiene la mayor longitud?. (2)¿Cuantos individuos tienen una longitud igual o menor al promedio total?. (3) ¿Cual es el la longitud promedio de los Individuos de Verano?
Pära exportar un tabla, por ejemplo nuestro objeto tabla_verano2 se usa la funcion write.table()
write.table(tabla_verano2, "Tabla_subset-verano.txt", sep = "\t", row.names = FALSE)
Dentro de tu projecto, en la carpeta data
hay cuatro archivos los cuales contienen los resultados de la actividad enzimatica de la lactado deshidrogenasa (LDH), citrato sintqasa (CS) y tauropina deshidrogenasa (TDH). Estas enzimas se analizaron en cuatro experimentos diferentes (Experimento1, Experimento2, Experimento3 y Experimento4).
Usando lo que hemos visto hasta ahora, realiza lo siguiente
ExpNum
TreatTemp
, y la actividad correspondiente a cada enzima Activityxxx
output
Crea un nuevo directorio de trabajo llamado datos_enzimas
y guarda cada subconjunto como archivo separado por comas csv
.
sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] workflowr_1.6.2
loaded via a namespace (and not attached):
[1] Rcpp_1.0.5 whisker_0.4 knitr_1.30 magrittr_2.0.1
[5] R6_2.5.0 rlang_0.4.10 fansi_0.4.1 stringr_1.4.0
[9] tools_4.0.5 xfun_0.20 utf8_1.1.4 git2r_0.27.1
[13] htmltools_0.5.0 ellipsis_0.3.1 rprojroot_2.0.2 yaml_2.2.1
[17] digest_0.6.27 tibble_3.0.4 lifecycle_1.0.0 crayon_1.4.1
[21] later_1.1.0.1 vctrs_0.3.6 promises_1.1.1 fs_1.5.0
[25] glue_1.4.2 evaluate_0.14 rmarkdown_2.6 stringi_1.5.3
[29] compiler_4.0.5 pillar_1.6.0 httpuv_1.5.4 pkgconfig_2.0.3