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()
.
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 database
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 : Factor w/ 3 levels "Asuncion","Bahia La Paz",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Estacion : Factor w/ 2 levels "Invierno","Verano": 2 2 2 2 2 2 2 2 2 2 ...
## $ Sexo : Factor w/ 2 levels "H","M": 1 2 1 1 2 1 1 2 1 2 ...
## $ Profundidad: Factor w/ 2 levels "Fondo","Superficie": 2 2 2 2 2 2 2 2 2 2 ...
## $ 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 Profundidad
## Min. : 1.00 Asuncion :48 Invierno:72 H:85 Fondo :66
## 1st Qu.: 36.75 Bahia La Paz:48 Verano :72 M:59 Superficie:78
## Median : 72.50 Todos Santos:48
## Mean : 72.50
## 3rd Qu.:108.25
## Max. :144.00
## Longitud_mm
## Min. : 6.20
## 1st Qu.:21.45
## 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.
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 nuestra se usa la funcion write.table()
write.table(tabla_verano2, "Tabla_subset-verano.txt", sep = "\t", row.names = FALSE)
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 /cloud/project/data
, por lo que cualquier cosa que guardemos, se hara en este directorio.
Ahora regresemos a nuestro directorio principal /cloud/project/
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
.
Tomando el ejemplo de cuando guardamos la tabla:
write.table(tabla_verano2, "data/Tabla_subset-verano.txt", sep = "\t", row.names = FALSE)
Al hacer esto, cada que guardamos o importamos algo estamos usando una ruta relativa, ya que solo definimos la ruta a partir de nuestro directorio de trabajo. Sin embargo es posible usar una ruta absoluta para exportar o importar un archivo. Por ejemplo
write.table(tabla_verano2, "/cloud/project/data_editados/Tabla_subset-verano.txt", sep = "\t", row.names = FALSE)
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.
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
datos_modificados
y guarda cada subconjunto como archivo separado por comas csv
.