Protocolo:
Daniel Felipe Villa Rengifo
Lenguaje: R
Tema: Manejo de arreglos en R
Fuentes:
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
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.
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:
crearemos dos vectores de diferentes longitudes.
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
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
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
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.
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
Una función llamada apply()
, ayuda a aplicar cualquier operación a través de los elementos del array.
Aquí x
es un array, el margen aquí se refiere a filas o columnas.
MARGIN=1 para la operación por filas
MARGIN=2 para la operación por columnas
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