Protocolo:

1 Arrays

En R, los arrays son los objetos de datos que nos permiten almacenar datos en más de dos dimensiones. En R, un array se crea con la ayuda de la función array(). Esta función array() toma un vector como entrada y para crear un array utiliza los valores de los vectores en el parámetro dim.

Por ejemplo, si creamos un array de dimensión (2, 3, 4) entonces se crearán 4 matrices rectangulares de 2 filas y 3 columnas

2 Sintaxis:

La sintaxis de los arrays en R es la que se describe a continuación:

  • data:

    Los datos son el primer argumento de la función array(). Es un vector de entrada que se da al array.

  • matrices:

    En R, un array consiste en matrices multidimensionales.

  • row_size:

    Este parámetro define el número de elementos de fila que puede almacenar un array.

  • column_size:

    Este parámetro define el número de elementos de las columnas que puede almacenar un array.

  • dim_names:

    Este parámetro se utiliza para cambiar los nombres por defecto de las filas y columnas.

3 ¿Como Crear Arrays?

En R, la creación de arrays es bastante sencilla. Podemos crear fácilmente un array utilizando la función vector (c()) y array().

En un array, los datos se almacenan en forma de matriz. Sólo hay dos pasos para crear una matriz que son los siguientes:

  1. crearemos dos vectores de diferentes longitudes.

  2. Una vez creados nuestros vectores, tomamos estos vectores como entradas a la matriz.

# Creando dos vectores de diferentes longitudes:
message("\n# Creando dos vectores de diferentes longitudes:")
## 
## # Creando dos vectores de diferentes longitudes:
u <- c(1,3,5)

v <- -5:0

## Tomando estos vectores como entrada para el array:
message("\n## Tomando estos vectores como entrada para el array:")
## 
## ## Tomando estos vectores como entrada para el array:
a <- array(c(u,v), dim = c(3,3,2))

cat("\n> a <- array(c(u,v), dim = c(3,3,2))", "\n \nOUTPUT:\n")
## 
## > a <- array(c(u,v), dim = c(3,3,2)) 
##  
## OUTPUT:
print(a)
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1   -5   -2
## [2,]    3   -4   -1
## [3,]    5   -3    0
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    1   -5   -2
## [2,]    3   -4   -1
## [3,]    5   -3    0

4 Nombrar las filas y columnas

podemos dar los nombres a las filas, columnas y matrices del array. Esto se hace con la ayuda del parámetro dim_name de la función array().

No es necesario dar el nombre a las filas y columnas. Sólo se utiliza para diferenciar la fila y la columna para una mejor comprensión.

# Tomando el Ejemplo anterior:
cat("\n# Tomando el Ejemplo anterior:\n")
## 
## # Tomando el Ejemplo anterior:
a <- array(c(u,v), dim = c(3,3,2))

cat("\n> a <- array(c(u,v), dim = c(3,3,2))", "\n \nOUTPUT:\n")
## 
## > a <- array(c(u,v), dim = c(3,3,2)) 
##  
## OUTPUT:
print(a)
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1   -5   -2
## [2,]    3   -4   -1
## [3,]    5   -3    0
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    1   -5   -2
## [2,]    3   -4   -1
## [3,]    5   -3    0
## Nombrando filas, columnas y matrices:
cat("\n## Nombrando filas, columnas y matrices:\n")
## 
## ## Nombrando filas, columnas y matrices:
col_names <- c("Col1","Col2","Col3")  
row_names <- c("fila1","fila2","fila3")  
matriz_names <- c("Matriz1","Matriz2") 

cat("\ncol_names <- c(\"Col1\",\"Col2\",\"Col3\")", "\nrow_names <- c(\"fila1\",\"fila2\",\"fila3\")", "\nmatrix_names <- c(\"Matriz1\",\"Matriz2\")\n")
## 
## col_names <- c("Col1","Col2","Col3") 
## row_names <- c("fila1","fila2","fila3") 
## matrix_names <- c("Matriz1","Matriz2")
# Tomando los vectores para ponerlos en el array:
message("\n# Tomando los vectores para ponerlos en el array:")
## 
## # Tomando los vectores para ponerlos en el array:
anom <- array(c(u,v), dim = c(3,3,2), dimnames = list(row_names, col_names, matriz_names))

cat("\n> anom <- array(c(u,v), dim = c(3,3,2), dimnames = list(row_names, col_names, matriz_names))", "\n \nOUTPUT:\n")
## 
## > anom <- array(c(u,v), dim = c(3,3,2), dimnames = list(row_names, col_names, matriz_names)) 
##  
## OUTPUT:
print(anom)
## , , Matriz1
## 
##       Col1 Col2 Col3
## fila1    1   -5   -2
## fila2    3   -4   -1
## fila3    5   -3    0
## 
## , , Matriz2
## 
##       Col1 Col2 Col3
## fila1    1   -5   -2
## fila2    3   -4   -1
## fila3    5   -3    0

5 Acceso a los elementos del array

Se accede a los elementos con la ayuda del índice. Simplemente, podemos acceder a los elementos del array con la ayuda del método de indexación.

"anom[Fila, Columna, Matriz]"
## [1] "anom[Fila, Columna, Matriz]"
cat("\nanom[Fila, Columna, Matriz]")
## 
## anom[Fila, Columna, Matriz]
# Llamar una fila:
print("# Llamar una fila:")
## [1] "# Llamar una fila:"
print(anom[1,,])
##      Matriz1 Matriz2
## Col1       1       1
## Col2      -5      -5
## Col3      -2      -2
# Llamar una columna:
print("# Llamar una columna:")
## [1] "# Llamar una columna:"
print(anom[,1,])
##       Matriz1 Matriz2
## fila1       1       1
## fila2       3       3
## fila3       5       5
# Llamar una matriz:
print("# Llamar una columna:")
## [1] "# Llamar una columna:"
print(anom[,,1])
##       Col1 Col2 Col3
## fila1    1   -5   -2
## fila2    3   -4   -1
## fila3    5   -3    0

6 Diferentes operaciones con Arrays:

El array está formado por matrices en múltiples dimensiones, de modo que las operaciones sobre los elementos de un array se realizan accediendo a los elementos de las matrices.

6.1 Suma y resta

La matriz multidimensional tiene que ser convertida a la matriz unidimensional, para poder ser sumada o restada.

# Creamos un nuevo array:
message("\n# Creamos un nuevo array:")
## 
## # Creamos un nuevo array:
v1 <- c(0,1,1,2)
v2 <- c(3,5,8,13,21,34,55,89,144,233,377,610)

fibo <- array(c(v1, v2), dim = c(4,4,3))
print(fibo)
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
# Sumemos y Restemos la matriz 1 y la 3:
message("\n# Sumemos la matriz 1 y la 3:")
## 
## # Sumemos la matriz 1 y la 3:
print("Matriz 1")
## [1] "Matriz 1"
cat("\nfibo[,,1]", "\n \nOUTPUT:\n")
## 
## fibo[,,1] 
##  
## OUTPUT:
print(fibo[,,1])
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
print("Matriz 3")
## [1] "Matriz 3"
cat("\nfibo[,,3]", "\n \nOUTPUT:\n")
## 
## fibo[,,3] 
##  
## OUTPUT:
print(fibo[,,3])
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
# Suma:
message("\n# Suma:")
## 
## # Suma:
cat("\nfibo[,,1] + fibo[,,3]", "\n \nOUTPUT:\n")
## 
## fibo[,,1] + fibo[,,3] 
##  
## OUTPUT:
print(fibo[,,1] + fibo[,,3])
##      [,1] [,2] [,3] [,4]
## [1,]    0    6   42  288
## [2,]    2   10   68  466
## [3,]    2   16  110  754
## [4,]    4   26  178 1220
# Resta:
message("\n# Resta:")
## 
## # Resta:
cat("\nfibo[,,1] - fibo[,,3]", "\n \nOUTPUT:\n")
## 
## fibo[,,1] - fibo[,,3] 
##  
## OUTPUT:
print(fibo[,,1] - fibo[,,3])
##      [,1] [,2] [,3] [,4]
## [1,]    0    0    0    0
## [2,]    0    0    0    0
## [3,]    0    0    0    0
## [4,]    0    0    0    0

6.2 Cálculos sobre elementos del Array

Una función llamada apply(), ayuda a aplicar cualquier operación a través de los elementos del array.

6.2.1 Sintaxis

Aquí x es un array, el margen aquí se refiere a filas o columnas.

  1. MARGIN=1 para la operación por filas

  2. MARGIN=2 para la operación por columnas

  3. MARGIN=c(1,2) para ambos.

fun es la función aplicada a través de los elementos de la matriz del marco de datos. Pueden ser las funciones estándar que forman parte de R o funciones personalizadas (definidas por el usuario)

# Intentemos la suma con apply():
message("\n# Intentemos la suma con apply():")
## 
## # Intentemos la suma con apply():
## array anterior:
cat("\n## array anterior:")
## 
## ## array anterior:
print(fibo)
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## Sumamos el array:
print("## Sumamos el array:")
## [1] "## Sumamos el array:"
cat("\n> apply(fibo,c(1,2), sum)", "\n \nOUTPUT:\n")
## 
## > apply(fibo,c(1,2), sum) 
##  
## OUTPUT:
print(apply(fibo,c(1,2), sum))
##      [,1] [,2] [,3] [,4]
## [1,]    0    9   63  432
## [2,]    3   15  102  699
## [3,]    3   24  165 1131
## [4,]    6   39  267 1830
#Definimos una función:
message("\n#Definimos una función:")
## 
## #Definimos una función:
cuadrado <- function(x){
  "Calcula el Cuadrado de la matriz"
  return(x^2)
}

## Ahora se la aplicamos a nuestro array:
cat("\n## Ahora se la aplicamos a nuestro array:\n")
## 
## ## Ahora se la aplicamos a nuestro array:
print(fibo)
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    3   21  144
## [2,]    1    5   34  233
## [3,]    1    8   55  377
## [4,]    2   13   89  610
## Sobre columnas y filas con numeros pseudo aletorios:
cat("\n## Sobre columnas y filas con numeros pseudo aletorios:\n")
## 
## ## Sobre columnas y filas con numeros pseudo aletorios:
for (t in 1:10) {
  s <- sample(1:3, size = 1, replace = T)
  if (s == 3){
    cua <- apply(fibo, c(1,2), cuadrado)
    message("\nSobre Ambos\n")
    print(cua)
  }else{
    if(s==1){
      cua <- apply(fibo, s, cuadrado)
      message("\nSobre Filas\n")
      print(cua)
    }else{
      cua <- apply(fibo, 2, cuadrado)
      message("\nSobre Columnas\n")
      print(cua)
    }
  }
}
## 
## Sobre Filas
##        [,1]  [,2]   [,3]   [,4]
##  [1,]     0     1      1      4
##  [2,]     9    25     64    169
##  [3,]   441  1156   3025   7921
##  [4,] 20736 54289 142129 372100
##  [5,]     0     1      1      4
##  [6,]     9    25     64    169
##  [7,]   441  1156   3025   7921
##  [8,] 20736 54289 142129 372100
##  [9,]     0     1      1      4
## [10,]     9    25     64    169
## [11,]   441  1156   3025   7921
## [12,] 20736 54289 142129 372100
## 
## Sobre Columnas
##       [,1] [,2] [,3]   [,4]
##  [1,]    0    9  441  20736
##  [2,]    1   25 1156  54289
##  [3,]    1   64 3025 142129
##  [4,]    4  169 7921 372100
##  [5,]    0    9  441  20736
##  [6,]    1   25 1156  54289
##  [7,]    1   64 3025 142129
##  [8,]    4  169 7921 372100
##  [9,]    0    9  441  20736
## [10,]    1   25 1156  54289
## [11,]    1   64 3025 142129
## [12,]    4  169 7921 372100
## 
## Sobre Filas
##        [,1]  [,2]   [,3]   [,4]
##  [1,]     0     1      1      4
##  [2,]     9    25     64    169
##  [3,]   441  1156   3025   7921
##  [4,] 20736 54289 142129 372100
##  [5,]     0     1      1      4
##  [6,]     9    25     64    169
##  [7,]   441  1156   3025   7921
##  [8,] 20736 54289 142129 372100
##  [9,]     0     1      1      4
## [10,]     9    25     64    169
## [11,]   441  1156   3025   7921
## [12,] 20736 54289 142129 372100
## 
## Sobre Columnas
##       [,1] [,2] [,3]   [,4]
##  [1,]    0    9  441  20736
##  [2,]    1   25 1156  54289
##  [3,]    1   64 3025 142129
##  [4,]    4  169 7921 372100
##  [5,]    0    9  441  20736
##  [6,]    1   25 1156  54289
##  [7,]    1   64 3025 142129
##  [8,]    4  169 7921 372100
##  [9,]    0    9  441  20736
## [10,]    1   25 1156  54289
## [11,]    1   64 3025 142129
## [12,]    4  169 7921 372100
## 
## Sobre Ambos
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    1    1    4
## [2,]    0    1    1    4
## [3,]    0    1    1    4
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    9   25   64  169
## [2,]    9   25   64  169
## [3,]    9   25   64  169
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]  441 1156 3025 7921
## [2,]  441 1156 3025 7921
## [3,]  441 1156 3025 7921
## 
## , , 4
## 
##       [,1]  [,2]   [,3]   [,4]
## [1,] 20736 54289 142129 372100
## [2,] 20736 54289 142129 372100
## [3,] 20736 54289 142129 372100
## 
## Sobre Columnas
##       [,1] [,2] [,3]   [,4]
##  [1,]    0    9  441  20736
##  [2,]    1   25 1156  54289
##  [3,]    1   64 3025 142129
##  [4,]    4  169 7921 372100
##  [5,]    0    9  441  20736
##  [6,]    1   25 1156  54289
##  [7,]    1   64 3025 142129
##  [8,]    4  169 7921 372100
##  [9,]    0    9  441  20736
## [10,]    1   25 1156  54289
## [11,]    1   64 3025 142129
## [12,]    4  169 7921 372100
## 
## Sobre Filas
##        [,1]  [,2]   [,3]   [,4]
##  [1,]     0     1      1      4
##  [2,]     9    25     64    169
##  [3,]   441  1156   3025   7921
##  [4,] 20736 54289 142129 372100
##  [5,]     0     1      1      4
##  [6,]     9    25     64    169
##  [7,]   441  1156   3025   7921
##  [8,] 20736 54289 142129 372100
##  [9,]     0     1      1      4
## [10,]     9    25     64    169
## [11,]   441  1156   3025   7921
## [12,] 20736 54289 142129 372100
## 
## Sobre Filas
##        [,1]  [,2]   [,3]   [,4]
##  [1,]     0     1      1      4
##  [2,]     9    25     64    169
##  [3,]   441  1156   3025   7921
##  [4,] 20736 54289 142129 372100
##  [5,]     0     1      1      4
##  [6,]     9    25     64    169
##  [7,]   441  1156   3025   7921
##  [8,] 20736 54289 142129 372100
##  [9,]     0     1      1      4
## [10,]     9    25     64    169
## [11,]   441  1156   3025   7921
## [12,] 20736 54289 142129 372100
## 
## Sobre Columnas
##       [,1] [,2] [,3]   [,4]
##  [1,]    0    9  441  20736
##  [2,]    1   25 1156  54289
##  [3,]    1   64 3025 142129
##  [4,]    4  169 7921 372100
##  [5,]    0    9  441  20736
##  [6,]    1   25 1156  54289
##  [7,]    1   64 3025 142129
##  [8,]    4  169 7921 372100
##  [9,]    0    9  441  20736
## [10,]    1   25 1156  54289
## [11,]    1   64 3025 142129
## [12,]    4  169 7921 372100
## 
## Sobre Ambos
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    0    1    1    4
## [2,]    0    1    1    4
## [3,]    0    1    1    4
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    9   25   64  169
## [2,]    9   25   64  169
## [3,]    9   25   64  169
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]  441 1156 3025 7921
## [2,]  441 1156 3025 7921
## [3,]  441 1156 3025 7921
## 
## , , 4
## 
##       [,1]  [,2]   [,3]   [,4]
## [1,] 20736 54289 142129 372100
## [2,] 20736 54289 142129 372100
## [3,] 20736 54289 142129 372100