En esta lección aprenderá sobre matrices y data frames. Ambos representan estructuras rectangulares de datos, es decir que almacenan datos en filas y columnas.La diferencias entre ambas, es que las matrices almacenan un unico tipo de datos, mientras que los data frames pueden contener distintos tipos de datos.

Este material esta basado en la leccion de “Matrices and Data Frames” de “R Programming”, paquete swirl.Author: Nick Carchedi, Organization: JHU Biostat, Version: 2.2.0.

Comencemos ahora!

Cree un vector conteniendo los números enteros entre 1 y 20, y almacene en una variable llamada my_vector.

my_vector <- 1:20
my_vector
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

La función The dim() informa sobre las “dimensiones” de un objeto. Sin embargo si aplicamos esta función al vector my_vector, el resulatado será NULL. Esto es porque al ser un vecto no tiene atributos para dim, sino que debemos utilizar la función lenght() para concer cuantos elementos tiene el vector.

dim(my_vector)
## NULL
length(my_vector)
## [1] 20

A continuación asignaremos valores para el atributo dim de my_vector. Esto se hace con dim(my_vector) <- c(4, 5). Luego consultamos dim(my_vector) o attributes(my_vector) para observar el numero de dimensiones asignado.

Lo que observamos es un objeto de 2 dimensiones (tabla rectangular), donde el primer numero corresponde con las filas y el segundo con las columnas. En nuestro caso, my_vector consta de 4 filas y 5 columnas. Es decir que ya no estamos ante un vector, sino ante una matriz. Hemos transformado el vector en una matriz. Para comprobar, veremos el contenido de my_vector.

dim(my_vector) <- c(4, 5)
dim(my_vector)
## [1] 4 5
attributes(my_vector)
## $dim
## [1] 4 5
my_vector
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

La función class() nos permite comprobar el tipo de objeto de la variable, en este caso: matrix. Por ello guardaremos esta variable en una nueva variable (my_matrix) que identifique mejor el tipo de objeto.

class(my_vector)
## [1] "matrix"
my_matrix <- my_vector

Una forma mas directa de crear una matriz es usando la función matrix(). Acceda a la ayuda ?matrix para conocer los argumentos de la función.

Cree una matriz conteniendo los mismos valores que antes (1-20) y con las dimensiones (4 filas, 5 columnas). Almacene el resultado en una nueva variable llamada my_matrix2.

?matrix
## starting httpd help server ... done
my_matrix2 <- matrix(1:20, nrow=4, ncol=5)
my_matrix2
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

Finalmente, confirmemos que my_matrix y my_matrix2 son identicas. Esto se hace con la función identical().

identical(my_matrix, my_matrix2)
## [1] TRUE

Ahora, imagine que la matriz representa observaciones de un experimento clinico, donde cada fila representa un paciente y cada columna representa una variable observada. Etiquetaremos las filas, de tal manera que cada número pertenezca a un paciente del experimento. Una forma de hacer esto es añadir una nueva columna con los nombres de los 4 pacientes. Primero, crearemos un vector con los 4 nombres – Bill, Gina, Kelly, and Sean. Recuerde que debe incluirse comillas dobles para cada nombre para indicar a R que se trata de una cadena de caracteres.

Luego usaremos la función cbind() para ‘combinar columnas’. No es necesario almacenar el resultado en una variable, sino que simplemente use la función cbind() con dos argumentos – el vector con los nombres de los pacientes y my_matrix.

El resultado muestra que ahora todos los elementos (nombres y números) están encerrados con comillas dobles. Esto significa que se dispone de una matriz con cadenas de caracteres. La razón es que las matrices solo contienen UN tipo de datos.

patients <- c("Bill", "Gina", "Kelly", "Sean")
cbind(patients, my_matrix)
##      patients                       
## [1,] "Bill"   "1" "5" "9"  "13" "17"
## [2,] "Gina"   "2" "6" "10" "14" "18"
## [3,] "Kelly"  "3" "7" "11" "15" "19"
## [4,] "Sean"   "4" "8" "12" "16" "20"

A continuación veremos como incluir los nombres de los pacientes, pero sin destruir la integridad de los datos numéricos. Eso se hace con la función data.frames(), de la siguiente manera my_data <- data.frame(patients, my_matrix). El resultado es una tabla, cuya clase es data.frame permitiendo almacenar datos de distinto tipo (texto y números).

my_data <- data.frame(patients, my_matrix)
my_data 
##   patients X1 X2 X3 X4 X5
## 1     Bill  1  5  9 13 17
## 2     Gina  2  6 10 14 18
## 3    Kelly  3  7 11 15 19
## 4     Sean  4  8 12 16 20
class(my_data)
## [1] "data.frame"

Existe otra manera de asignar nombres individuales a las filas y a las columnas de un data frame. Asignaremos el nombre a las columnas. Tenemos 6 columnas, el nombre de los pacientes y 5 variables observadas. Primero creamos un vector llamado cnames que contiene los siguientes valores (en ese orden) – “patient”, “age”, “weight”, “bp”, “rating”, “test”. Luego usamos la función colnames() para asignar el vector cnames como nombres de las columnas. Finalmente revisamos los datos para asegurarnos que los nombres hayan sido asignados.

cnames <- c("patient", "age", "weight", "bp", "rating", "test")
colnames(my_data)
## [1] "patients" "X1"       "X2"       "X3"       "X4"       "X5"
colnames(my_data) <- cnames
colnames(my_data)
## [1] "patient" "age"     "weight"  "bp"      "rating"  "test"
my_data
##   patient age weight bp rating test
## 1    Bill   1      5  9     13   17
## 2    Gina   2      6 10     14   18
## 3   Kelly   3      7 11     15   19
## 4    Sean   4      8 12     16   20

Ha llegado al final de esta leccion!