head

‎"oɯsıɯ ol ǝɹdɯǝıs sɐƃɐɥ ou ,soʇuıʇsıp sopɐʇlnsǝɹ sɐɔsnq ıS"

Trabajando con Matrices en R

 Para crear una matriz en R se utiliza la función
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

donde matrix() corresponde al nombre de la función y todo lo que está dentro de los paréntesis son los argumentos de dicha función.

Argumentos

data Es un vector de datos opcional
nrow número deseado de filas
ncol número deseado de columnas
byrow valor lógico. Si es falso (valor por defecto), la matriz se llena por orden columna, de otra manera se llenará primero por filas
dimnames utilizado para darles nombres a las filas y a las columnas, respectivamente
Ejemplo:
 A<-matrix(c(5, 7, 13, 4, 1, 7, 14, 3, 11), nrow=3, ncol=3, byrow=F,
+dimnames=list(c("Blanco", "Negro", "Rojo"), c("Toyota", "Audi", "Nissan")))

        Toyota Audi Nissan 
Blanco      5    4     14
Negro       7    1      3
Rojo       13    7     11


Se hubiera logrado el mismo resultado si sólo se escribe uno de los argumentos nrow=3 ó ncol=3, no hace falta escribir los dos, ahora veamos cómo cambia el resultado si indicamos en byrow=T (TRUE), es decir que la matriz se llene por columnas y no por filas.

A<-matrix(c(5, 7, 13, 4, 1, 7, 14, 3, 11), nrow=3, ncol=3, byrow=T,                                 +dimnames=list(c("Blanco", "Negro", "Rojo"), c("Toyota", "Audi", "Nissan")))

          Toyota Audi Nissan
 Blanco      5    7     13
 Negro       4    1      7
 Rojo       14    3     11

Para obtener más información sobre las matrices escriba ?matrix y ejecútelo pulsando enter si trabaja directamente en la página principal de R o pulsando Ctrl + r si trabaja desde un script (recomendado)



Agregando Filas y Columnas a una matriz: funciones rbind y cbind
Para agregar una fila a una matriz ya existente como en el caso de la matriz A creada en el ejemplo anterior, se debe utilizar la función rbind() y se usará la función cbind() para añadir columnas a una matriz. Como ejemplo agregaremos un nuevo color a la matriz A, con lo cual se debe entender que se agregará una fila más debajo de Rojo la cual llamaremos Azul y contendrá los valores 8, 5, 7. Con lo cual haremos:

Azul<-c(8,5,7) # con esto creamos el vector Azul con sus correspondientes elementos

A<-rbind(A, Azul)


         Toyota Audi Nissan
 Blanco      5    7     13
 Negro       4    1      7
 Rojo       14    3     11
 Azul        8    5      7


Ahora agregaremos a esa misma matriz A, una nueva columna llamada Hyundai y contendrá los siguientes valores 2, 7, 3, 5

Hyundai<-c(2,7,3,5) #con esto creamos el vector Hyundai con sus correspondientes elementos

A<-cbind(A,Hyundai)


         Toyota Audi Nissan Hyundai
 Blanco      5    7     13       2
 Negro       4    1      7       7
 Rojo       14    3     11       3
 Azul        8    5      7       5


Seleccionando elementos de una matriz.
Los elementos de una matriz están indexados con dos índices lo cual hace que resulte fácil acceder a los elementos y trabajar con ellos si lo que nos interesa es sólo una parte de la información contenida en una matriz y no la matriz entera, esto se logra con el operador de indexación [i, j] donde i es el elemento fila y j es el elemento columna, esto es así porque si A es una matriz, entonces sus elementos serán $a_{i,j}$, de manera que si quisiéramos seleccionar el número de automóviles blancos correspondiente a la marca Audi podríamos hacerlo de dos maneras:

1. Escribimos el nombre de la matriz y luego entre corchetes la ubicación siendo [nombre de fila, nombre de columna], los nombres deberán ir entre comillas.
A["Blanco", "Audi"] 
[1] 7

2. Escribimos el nombre de la matriz y luego entre corchetes la ubicación siendo [número de fila, número de columna]
A[1,2]
[1] 7

En la segunda orden lo que se indica a R es que me muestre el elemento que ocupa la posición (1,2), es decir, aquél elemento que está en la fila 1 y columna 2.

También se pueden seleccionar vectores enteros, vamos a seleccionar todos los vehículos correspondientes al color blanco, para ello lo que le debemos pedir a R es que nos seleccione y muestre todos los elementos que están en la fila 1, esto se hace así:
A[1,]                   # otra forma de hacerlo es 
A["Blanco",]

Toyota    Audi  Nissan Hyundai
   5       7      13       2


A manera de ejercicios haremos lo siguiente:
  1. Seleccionar todos los vehículos negros y rojos
  2. Seleccionar todos los vehículos marca Toyota y Audi
  3. Seleccionar sólo los Nissan y Hyundai azules
  4. Agregar una nueva marca: Kia con valores 7, 1, 9, 12
  5. Agregar una nueva fila llamada Verde con los siguientes valores 4, 5, 2, 1, 0
  6. Seleccionar los Hyundai y Kia azules y verdes
Solución:

1. Seleccionar todos los vehículos negros y rojos
A[2:3,] 

      Toyota Audi Nissan Hyundai
 Negro      4    1      7       7
 Rojo      14    3     11       3


4. Agregar una nueva marca: Kia con valores 7, 1, 9, 12
A<-cbind(A,Kia)  

       Toyota Audi Nissan Hyundai Kia
 Blanco      5    7     13       2   7
 Negro       4    1      7       7   1
 Rojo       14    3     11       3   9
 Azul        8    5      7       5  12


2. Seleccionar todos los vehículos marca Toyota y Audi
 A[,1:2] 
       Toyota Audi
 Blanco      5    7
 Negro       4    1
 Rojo       14    3
 Azul        8    5


5. Agregar una nueva fila llamada Verde con los siguientes valores 4, 5, 2, 1, 0
A<-rbind(A, Verde)

       Toyota Audi Nissan Hyundai Kia
 Blanco      5    7     13       2   7
 Negro       4    1      7       7   1
 Rojo       14    3     11       3   9
 Azul        8    5      7       5  12
 Verde       4    5      2       1   0


3. Seleccionar sólo los Nissan y Hyundai azules
A[4,3:4] 

Nissan Hyundai
      7       5




6. Seleccionar los Hyundai y Kia azules y verdes
 A[4:5,4:5] 
      Hyundai Kia
 Azul        5  12
 Verde       1   0


Eliminando filas y columnas
Ya hemos visto cómo se agregan filas y columnas a una matriz ya existente, pero a veces es útil también eliminarlas y así de fácil como es agregar así de fácil es eliminar también.

A continuación vamos a eliminar la fila y la columna que agregamos en el parte 5 y 6 del ejercicio anterior, es decir, vamos a eliminar la fila Verde y la columna Kia.

Para eliminar filas o columnas hay que tener en cuenta la forma de indexar Matrices, aquí hay un documento que explica muy bien esto.




Eliminando la columna Kia Eliminando la fila Verde
 A<-A[ ,-5]
 A<-A[ ,-"Kia"]
       Toyota Audi Nissan Hyundai
Blanco      5    7     13       2 
 Negro       4    1      7       7
 Rojo       14    3     11       3
 Azul        8    5      7       5
 Verde       4    5      2       1


También se pudo haber eliminado de una sola vez  
A<-A[-5,-5] ó 
A<-A[-"Verde",-"Kia"]

 A<-A[-5,]
A<-A[-"Verde",]
       Toyota Audi Nissan Hyundai
 Blanco      5    7     13       2
 Negro       4    1      7       7
 Rojo       14    3     11       3
 Azul        8    5      7       5


Transponer una Matriz
Una función muy útil es la transposición de matrices, como ya se había mencionado anteriormente en Introducción a las funciones básicas de R: Funciones con Vectores, la función t() es para transponer tanto vectores como matrices, en este caso la usaremos para transponer la matriz A que hemos creado y editado a lo largo de toda esta página.


Matriz A
print(A)


    Toyota Audi Nissan Hyundai 
Blanco      5    7     13       2
 Negro       4    1      7       7
 Rojo       14    3     11       3
 Azul        8    5      7       5


Transpuesta de A
t(A)


       Blanco Negro Rojo Azul 
Toyota       5     4   14    8
 Audi         7     1    3    5
 Nissan      13     7   11    7
 Hyundai      2     7    3    5


Suma y resta de matrices
Dos matrices son conformables para la suma y resta si son de la misma dimensión, teniendo esto en mente, en R podemos fácilmente sumar y restar matrices indicando la suma con + y la resta con –

A continuación le sumaremos a la matriz A de nuestro ejemplo anterior su transpuesta y luego a la matriz A le restaremos su transpuesta.


A + t(A)
A+t(A) 


       Toyota Audi Nissan Hyundai
 Blanco     10   11     27      10
 Negro      11    2     10      12
 Rojo       27   10     22      10
 Azul       10   12     10      10






A - t(A)
 A-t(A) 


       Toyota Audi Nissan Hyundai
 Blanco      0    3     -1      -6
 Negro      -3    0      4       2
 Rojo        1   -4      0      -4
 Azul        6   -2      4       0


Multiplicación de Matrices
Tal y como se había comentado anteriormente en Introducción a las funciones básicas de R: Funciones con Vectores, hay dos formas de multiplicar matrices: la multiplicación elemento a elemento y la multiplicación definida por el álgebra matricial donde debe cumplirse la condición de conformabilidad   para la multiplicación donde el número de columnas de la primera matriz debe ser igual al número de filas de la segunda. Para multiplicar dos matrices elemento a elemento estas deben ser de igual dimensión.

Debe recordarse que la multiplicación elemento a elemento se indica con el símbolo * y la multiplicación matricial con los símbolos %*%, a continuación se hacen estas dos multiplicaciones, multiplicaremos a la matriz A por su transpuesta:

Multiplicación elemento a elemento
 A*t(A)


      Toyota Audi Nissan Hyundai
 Blanco     25   28    182      16
 Negro      28    1     21      35
 Rojo      182   21    121      21
 Azul       16   35     21      25





Multiplicación matricial
 A%*%t(A) 

      Blanco Negro Rojo Azul
 Blanco    247   132  240  176
 Negro     132   115  157  121
 Rojo      240   157  335  219
 Azul      176   121  219  163


Determinante de una matriz
Para obtener el determinante de cualquier matriz, se usa la función det(), recuérdese que para poder calcular el determinante de cualquier matriz esta debe ser cuadrada. El determinante de nuestra matriz A es:
det(A) 
[1] 3028

Inversa de una matriz

Es muy sencillo calcular la inversa de una matriz en R, todo lo que se necesita es aplicar la función solve() a la matriz de la cual se desea obtener su inversa. Es importante tener en en cuenta que sólo las matrices cuyo determinante sea diferente de cero tiene tienen una inversa definida (son invertibles), en nuestro caso la matriz A tiene determinante diferente de cero con lo cual se le puede calcular la inversa y esta es:


solve(A) 
             Blanco       Negro        Rojo        Azul
 Toyota  -0.06737120 -0.05614267  0.07793923  0.05878468
 Audi     0.03830911 -0.13474240 -0.11294584  0.24108322
 Nissan   0.09114927  0.07595773  0.04161162 -0.16776750
 Hyundai -0.05812417  0.11822985 -0.07001321  0.09973580


Extrayendo la diagonal principal de una matriz
En ocasiones es muy importante trabajar sólo con los valores de la diagonal principal de una matriz, por ejemplo en el caso de la diagonal de la matriz de varianzas y covarianzas, donde la diagonal contienen los valores de las varianzas de las variables aleatorias, en este caso resultaría útil contar con una función que nos proporciones esa información dada una matriz, esa función es diag(), con esta función obtendremos la diagonal de la matriz A y de la inversa de A.


Diagonal de A
 diag(A) 

[1]  5  1 11  5


Diagonal de la inversa de A
 diag(solve(A)) 
[1] -0.06737120 -0.13474240  0.04161162  0.09973580

Tal y como se aprecia en los resultados, la función diag() nos devuelve un vector que contiene los elementos de la diagonal de la matriz que se le ha proporcionado. Nótese que si a la función diag() le proporcionamos una matriz, nos devuelve su diagonal, pero ¿Qué pasaría si en lugar de darle como argumento una matriz, le damos un número concreto? La respuesta a esta pregunta da pie a la siguiente sección.

Generar una matriz unitaria de dimensión m x m
Si a la función diag() en vez de proporcionarle una matriz para que nos devuelva su diagonal, le proporcionamos un número (un escalar) nos devuelve una matriz unitaria con elementos en su diagonal principal igual al número que le hemos proporcionado y de dimensión igual a ese mismo número multiplicado por él mismo, puesto que la matriz unitaria es cuadrada, es decir que si a R le decimos que ejecute diag(3) nos construirá una matriz unitaria 3x3, veámoslo a continuación.



diag(3)

    [,1] [,2] [,3]
 [1,]    1    0    0
 [2,]    0    1    0
 [3,]    0    0    1



diag(5)

    [,1] [,2] [,3] [,4] [,5]
 [1,]    1    0    0    0    0
 [2,]    0    1    0    0    0
 [3,]    0    0    1    0    0
 [4,]    0    0    0    1    0
 [5,]    0    0    0    0    1



diag(8)

   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
 [1,]    1    0    0    0    0    0    0    0
 [2,]    0    1    0    0    0    0    0    0
 [3,]    0    0    1    0    0    0    0    0
 [4,]    0    0    0    1    0    0    0    0
 [5,]    0    0    0    0    1    0    0    0
 [6,]    0    0    0    0    0    1    0    0
 [7,]    0    0    0    0    0    0    1    0
 [8,]    0    0    0    0    0    0    0    1



Además hemos creado una matriz unitaria 5x5 y otra 8x8.





¿Ha sido de utilidad? ¿Ha sido claro? Deja tu comentario!


Jilber Urbina

27 comentarios:

  1. Hola,os pregunto: Como podria eleminar una fila en una matriz.

    Agradezco vuestra ayuda

    Ana

    ResponderEliminar
  2. # Creo una matriz A 5x5 para ilustar el ejemplo

    set.seed(123)
    columnas <- paste("Columna", 1:5, sep=" ")
    filas <- paste("Fila", 1:5, sep=" ")
    A <- matrix(rnorm(50), 5, 5, dimnames=list(filas, columnas))

    # Recordá la indexación de matrices:
    # podés acceder a los elementos de una fila y una columna através del operador []:
    # Matriz[Fila, Columna]
    # si tenés una matriz A 5x5, y querés eliminar la fila 5 y mantener todo el resto
    # de la información, basta con indicar A[-5,] esto indica que te que elimine la fila 5
    # pero que te mantenga todas las columnas. Abajo algunos ejemplos.


    ### Eliminar ·Fila 5· de la matriz A
    A[-5, ] # Esto indica a R que tiene que darte de la matriz A todas las filas
    # excepto la 5, pero manteniendote todas las columnas

    # podés ver indexación de matrices en
    # http://cran.r-project.org/doc/manuals/R-intro.html#Index-matrices

    ## Eliminar dos filas consecutivas: la 4 y la 5
    A[-(4:5),]

    ## Eliminar dos filas no consecutivas: la 1 y la 5
    A[-c(1,5), ]

    # Eliminar una columna concreta, es lo mismo, por ejemplo eliminando la columna 5
    A[ ,-5]

    # eliminado fila 5 y columna 5
    A[-5,-5]

    # Espero que te sirva.

    ResponderEliminar
  3. Muchas Gracias por la información, me sirvió mucho :)

    ResponderEliminar
  4. Tengo una duda con un "Reshape"

    Tengo una matriz:

    a b c
    x 1 2 3
    y 3 3 2

    y la necesito así:

    x a 1
    x b 2
    x c 3
    y a 3
    y b 3
    y c 2

    Saludos!!

    ResponderEliminar
    Respuestas
    1. Fácilmente se puede realizar con la función 'melt' del paquete 'reshape'. Usa las siguientes líneas:

      install.packages("reshape")
      library(reshape)
      melt(t(mat))[, c(2,1,3)]

      Eliminar
  5. De super utilidad! Gracias

    ResponderEliminar
  6. hola, si tengo un modelo y dentro de este modelo se genera un vector llamado estimate, como multiplico este vector por cada renglon de una tabla de datos?

    ResponderEliminar
  7. Respuestas
    1. sum(diag(nombre_de_tu_matriz))

      La función diag(·) extrae los elementos de la diagonal principal de una matriz, en tanto que la función sum(·), suma los elementos que le han sido proporcionados.

      Eliminar
  8. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. hola... como puedo obtener el rango de una matriz???

    ResponderEliminar
    Respuestas
    1. Acá te propongo 3 opciones sencillas:

      sea A, tu matriz definida de la siguiente manera A <- matrix(1:4, 2)

      Opción 1, usar función 'rankMatrix'

      library(Matrix)
      rankMatrix(A)

      Opción 2, contar el número de autovalores distintos de cero
      sum(eigen(A)$values!=0)

      Opción 3, con la función 'qr'
      qr(A)$rank

      Eliminar
  11. ¿Cómo puedo añadir, en un array, una columna resultante de operar con otras 2 columnas? Osea, se trataría de hacer una operación a todas las matrices que forman mi array de dimensión N.
    Gracias!

    ResponderEliminar
  12. estoy tratando de correr un código pero no entiendo esta parte de las diagonales

    este es el código

    W<-diag(0,I)
    Error en diag(0, I) : valor de 'nrow' no válido (demasiado grande o NA)
    > for(i in 1:I){
    + a<-ss[i]
    + for(k in 1:num[i]){
    + W[i,adj[a+k-1]]<-1}
    + }
    Error en 1:I : Argumento NA/NaN

    ResponderEliminar
  13. como elimino columnas o filas que contengan NaN

    ResponderEliminar
  14. Tengo una matriz con determinante del orden e^-18 (es distinto de cero,pero no mucho), el caso es que no me deja invertirla, ¿cual es la forma de proceder en estos casos? (¿el valor del determinante es ese por errores en el redondeo cuando deberia ser 0?)

    ResponderEliminar
  15. De mucha utilidad, muchas gracias.

    Tengo una duda, cómo puedo invertir el orden de los elementos de una matriz? Es decir, si tengo una matriz así:

    A=[1 5 6 8
    2 7 8 3
    3 2 5 7]

    cómo puedo obtener esto:

    B=[3 2 5 7
    2 7 8 3
    1 5 6 8]

    Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Una forma de hacerlo es A[rev(1:nrow(A)), ]

      Ejemplo

      # creando tu matiz en R
      A <- matrix(c(1,5,6,8,
      2,7,8,3,
      3,2,5,7), ncol=4, byrow=TRUE)
      A
      [,1] [,2] [,3] [,4]
      [1,] 1 5 6 8
      [2,] 2 7 8 3
      [3,] 3 2 5 7

      # cambiando el orden
      A[rev(1:nrow(A)), ]
      [,1] [,2] [,3] [,4]
      [1,] 3 2 5 7
      [2,] 2 7 8 3
      [3,] 1 5 6 8

      Eliminar
  16. Simplemente hacés el producto usando el operador '*'. Ejemplo
    > A <- matrix(1:4, 2) # Crea una matrix 2x2
    > 2*A # producto de un número con una matriz
    [,1] [,2]
    [1,] 2 6
    [2,] 4 8

    ResponderEliminar
  17. ¿Como puedo calcular la entrada de una matriz? Por ejemplo la entrada (2,3)

    ResponderEliminar
  18. No entiendo tu pregunta, aclara un poco más.

    ResponderEliminar
  19. Hola, si tengo una matriz en la que mi primera columna "V1" tiene valores como "ENSG00000149089.11" y deseo quitar a todas el "." y los números que siguen al "." ¿qué código debo utilizar?. Son 60483 filas.

    ResponderEliminar
  20. Podés utilizar lo siguiente:

    gsub("\\.[0-9]+$", "", TuMatriz[,"V1"])

    ResponderEliminar