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

39 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. Como puedo sumar los números de la diagonal?

    ResponderEliminar
    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. como multiplico un numero por una matriz?

    ResponderEliminar
  17. como multiplico un numero por una matriz?

    ResponderEliminar
  18. 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
  19. ¿Como puedo calcular la entrada de una matriz? Por ejemplo la entrada (2,3)

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

    ResponderEliminar
  21. Hola buenas, el ejercicio es el siguiente:"Crea una función que, dada un número n ∈ N y un valor k ∈ R, devuelva la matriz n × n:" no puedo adjuntar fotos pero el resultado es una matriz con todos los valores 1, menos en la diagonal que aparece el valor "k" (de dimension nxn).
    Yo tengo puesto esto, pero no se por que no se me ejecuta, pero lo que es la idea, está bien, me podrias ayudar?

    M=function(n,k){
    A=matrix(1,n,n)
    b=diag(diag(A))
    c=diag(k,n)
    M=A-b+c
    }

    ResponderEliminar
  22. 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
  23. Podés utilizar lo siguiente:

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

    ResponderEliminar
  24. si tengo una matriz de 5*5 donde la ultima columna es la suma de las anteriores columnas como puedo sacar cada una de las proporciones de las celdas?

    ResponderEliminar
    Respuestas
    1. Supogamos tu matriz 5x5 se llama Mat y está definida así:

      Mat <- matrix(1:20, ncol=4)
      Mat <- cbind(Mat, rowSums(Mat))

      La cual luce de esta manera
      [,1] [,2] [,3] [,4] [,5]
      [1,] 1 6 11 16 34
      [2,] 2 7 12 17 38
      [3,] 3 8 13 18 42
      [4,] 4 9 14 19 46
      [5,] 5 10 15 20 50

      Entonces para obtener tu resultado podés usar la función 'sweep' de la siguiente manera
      sweep(x=Mat[, -5], MARGIN = 1, STATS = Mat[, 5], FUN="/")*100

      O más fácil aún, se puede usar '/' ya que esta es una función vectorizada
      Mat[, -5]/Mat[, 5]*100

      Ambos te darán el mismo resultado. :) el cual es.....
      [,1] [,2] [,3] [,4]
      [1,] 2.941176 17.64706 32.35294 47.05882
      [2,] 5.263158 18.42105 31.57895 44.73684
      [3,] 7.142857 19.04762 30.95238 42.85714
      [4,] 8.695652 19.56522 30.43478 41.30435
      [5,] 10.000000 20.00000 30.00000 40.00000

      Eliminar
  25. Buenas tardes, tengo una inquietud, si tengo una lista y dentro hay varias matrices, como podria realizar la suma de dichas matrices de tal manera que el resultado sea la suma de todas las matrices internas.

    Gracias

    ResponderEliminar
  26. Buenas tardes, como puedo sumar matrices de manera directa que estan dentro de una lista?

    Gracias

    ResponderEliminar
    Respuestas
    1. Si esas matrices tienen la misma dimensión, entonces podés obtener la suma de la siguiente manera:

      Reduce("+", tuLista)

      Donde "tuLista" es el nombre de la lista que contiene las matrices.

      El resultado de eso es una matriz que resulta de sumar todas las matrices de la lista.

      Si querés la suma de la suma de las matrices, entonces

      sum(Reduce("+", tuLista))

      Eliminar
  27. Hola!

    Alguien podría ayudarme en ¿cómo multiplicar una matriz de dimensiones mxn con otra matriz de dimensiones mxnxp siendo que la matriz final sea mxnxp?

    ResponderEliminar
  28. Hola!

    Cómo puedo multiplicar una matriz mxn con otra de mxnxp?

    Saludos

    ResponderEliminar
  29. Hola, me gustaría saber si existe algún comando para la diagonal de un número en cualquier posición. Es decir si por ejemplo tengo una matriz A de 4x4 y me ubico en la posición A[2,3], podría sacar los valores de su respectiva diagonal en esa posición.

    ResponderEliminar
  30. Hola tengo un vector gigante de 10000 elementos y con él quiero quiero hacer matrices de 10 por 10 pero quiero que quede algo así: 2 3 4 5 6 el resto de las posiciones sin llenar que tengan un valor NA. Los valores que no son NA son 55 elementos de
    2 3 4 5 mi vector gigante. Alguien puede ayudarme por favor?
    2 3 4
    2 3
    2

    ResponderEliminar