CC BY-NC-ND 3.0
vectorvectorEn R, un vector es una combinación de datos con la particularidad de que todos los datos contenidos en un vector son del mismo tipo. Podemos almacenar por ejemplo múltiples elementos del tipo character o numeric en un vector, pero no ambos. El contenedor vector es importante porque es el elemento básico de R.
miVec <- c(1, 5, 3, 6)
print(miVec)## [1] 1 5 3 6
vectortypeof(miVec)## [1] "double"
is.vector(miVec)## [1] TRUE
miVec <- as.integer(c(1, 5, 3, 6))
typeof(miVec)## [1] "integer"
vectormiVec02 <- c("a", "b", "c")
print(miVec02)## [1] "a" "b" "c"
typeof(miVec02)## [1] "character"
is.vector(miVec02)## [1] TRUE
vectorEl valor NA se puede usar para especificar que no hay datos o datos faltantes.
miVecNA <- c(1, NA, 3, NA, 5)
print(miVecNA)## [1] 1 NA 3 NA 5
typeof(miVecNA)## [1] "double"
is.vector(miVecNA)## [1] TRUE
vectorSi combinamos diferentes tipos de datos, R intentará transformar los elementos en un tipo de forma predeterminada.
miVecNA <- c(1, NA, 3, NA, 5, "NA")
print(miVecNA)## [1] "1" NA "3" NA "5" "NA"
typeof(miVecNA)## [1] "character"
vectorPodemos combinar objetos existentes dentro de un vector.
vecA <- c("a", "b")
vecB <- c("e", "f")
vecC <- c(vecA, "c", "d", vecB)
print(vecC)## [1] "a" "b" "c" "d" "e" "f"
vectormiVecNA <- c(1, NA, 3, NA, 5)
miVecNA + 100## [1] 101 NA 103 NA 105
Se llama vectorización y eso es lo que hace que R es tan poderoso. Siempre que sea posible, intentaremos realizar operaciones utilizando vectorización.
vectormiVec1 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1)
print(miVec1)## [1] 1 1 1 1 1 1 1 1 1
miVec2 <- c(10, 20, 30)
print(miVec2)## [1] 10 20 30
miVec1 + miVec2## [1] 11 21 31 11 21 31 11 21 31
vectorPara acceder a un elemento de un vector usamos los corchetes [].
miVec20 <- c(10, 20, 30, 40, 50, 60, 70, 80, 90)
miVec21 <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")
miVec20[1]## [1] 10
miVec21[3]## [1] "c"
vectormiVec20[c(1, 5, 9)]## [1] 10 50 90
miVec21[c(4, 3, 1)]## [1] "d" "c" "a"
miVec21[c(4, 4, 3, 4, 3, 2, 5)]## [1] "d" "d" "c" "d" "c" "b" "e"
vectormiVec20[miVec20 >= 50]## [1] 50 60 70 80 90
miVec20[(miVec20 >= 50) & ((miVec20 < 80))]## [1] 50 60 70
miVec20[miVec20 != 50]## [1] 10 20 30 40 60 70 80 90
vectormiVec20[miVec20 == 30]## [1] 30
miVec20[(miVec20 == 30) | (miVec20 == 50)]## [1] 30 50
miVec21[miVec21 == "a"]## [1] "a"
vectormiVec21[miVec20 >= 50]## [1] "e" "f" "g" "h" "i"
miVec21[(miVec20 >= 50) & ((miVec20 < 80))]## [1] "e" "f" "g"
miVec21[miVec20 != 50]## [1] "a" "b" "c" "d" "f" "g" "h" "i"
vectormiVec21[miVec20 == 30]## [1] "c"
miVec21[(miVec20 == 30) | (miVec20 == 50)]## [1] "c" "e"
miVec21[(miVec20 == 30) | (miVec21 == "h")]## [1] "c" "h"
vectorprint(miVec20[-1])## [1] 20 30 40 50 60 70 80 90
print(miVec21[-5])## [1] "a" "b" "c" "d" "f" "g" "h" "i"
print(miVec20[-c(1, 2, 5)])## [1] 30 40 60 70 80 90
print(miVec21[-c(1, 2, 5)])## [1] "c" "d" "f" "g" "h" "i"
vectormiVec22 <- c(TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE)
miVec21[miVec22]## [1] "a" "b" "d" "f" "h" "i"
vectormiVec23 <- c(aaa = 10, bbb = 20, ccc = 30, ddd = 40, eee = 50)
print(miVec23)## aaa bbb ccc ddd eee
## 10 20 30 40 50
miVec23["bbb"]## bbb
## 20
names(miVec23)## [1] "aaa" "bbb" "ccc" "ddd" "eee"
vectorprint(miVec21)## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i"
miVec21[3] <- "zzz"
print(miVec21)## [1] "a" "b" "zzz" "d" "e" "f" "g" "h" "i"
miVec21[(miVec20 >= 50) & ((miVec20 < 80))] <- "0"
print(miVec21)## [1] "a" "b" "zzz" "d" "0" "0" "0" "h" "i"
vectorprint(miVec23)## aaa bbb ccc ddd eee
## 10 20 30 40 50
miVec23["ccc"] <- miVec23["ccc"] + 100
print(miVec23)## aaa bbb ccc ddd eee
## 10 20 130 40 50
vectorprint(miVec23)## aaa bbb ccc ddd eee
## 10 20 130 40 50
names(miVec23)[2] <- "bb_bb"
print(miVec23)## aaa bb_bb ccc ddd eee
## 10 20 130 40 50
vectorPodemos hacer mucho más con un vector y volveremos a su manejo y operaciones posibles en el capítulo sobre funciones…
listlistEl contenedor de tipo list le permite almacenar listas de elementos. Contrariamente a lo que vimos antes con el tipo vector, los elementos del tipo list pueden ser diferentes (por ejemplo, un vector de tipo numeric, luego un vector de tipo character). Los elementos del tipo list también pueden ser contenedores diferentes (por ejemplo, un vector, luego una list).
listmiList01 <- list()
print(miList01)## list()
listmiList02 <- list(5, "qwerty", c(4, 5, 6), c("a", "b", "c"))
print(miList02)## [[1]]
## [1] 5
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
listmiList03 <- list(5, "qwerty", list(c(4, 5, 6), c("a", "b", "c")))
print(miList03)## [[1]]
## [1] 5
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [[3]][[1]]
## [1] 4 5 6
##
## [[3]][[2]]
## [1] "a" "b" "c"
listis.list(miList02)## [1] TRUE
typeof(miList02)## [1] "list"
listLos elementos del contenedor list son identificables por los corchetes dobles [[ ]].
print(miList02)## [[1]]
## [1] 5
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
listtypeof(miList02)## [1] "list"
miList02[[1]]## [1] 5
typeof(miList02[[1]])## [1] "double"
listprint(miList02)## [[1]]
## [1] 5
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
miList02[[4]][2]## [1] "b"
listmiList04 <- list(miList02, miList03)
print(miList04)## [[1]]
## [[1]][[1]]
## [1] 5
##
## [[1]][[2]]
## [1] "qwerty"
##
## [[1]][[3]]
## [1] 4 5 6
##
## [[1]][[4]]
## [1] "a" "b" "c"
##
##
## [[2]]
## [[2]][[1]]
## [1] 5
##
## [[2]][[2]]
## [1] "qwerty"
##
## [[2]][[3]]
## [[2]][[3]][[1]]
## [1] 4 5 6
##
## [[2]][[3]][[2]]
## [1] "a" "b" "c"
listmiList04[[2]][[3]][[1]][1]## [1] 4
listbddInsect <- list(Snonagrioides = list(site01 = c(12, 5, 8, 7), site02 = c(5, 23, 4, 41), site03 = c(12, 0, 0, 0)), Onubilalis = list(site01 = c(12, 1, 2, 3), site02 = c(0, 0, 0, 1), site03 = c(1, 1, 2, 3)))
print(bddInsect)## $Snonagrioides
## $Snonagrioides$site01
## [1] 12 5 8 7
##
## $Snonagrioides$site02
## [1] 5 23 4 41
##
## $Snonagrioides$site03
## [1] 12 0 0 0
##
##
## $Onubilalis
## $Onubilalis$site01
## [1] 12 1 2 3
##
## $Onubilalis$site02
## [1] 0 0 0 1
##
## $Onubilalis$site03
## [1] 1 1 2 3
listEl código está hecho para la máquina, pero también para los humanos.
bddInsect <- list(
Snonagrioides = list(
site01 = c(12, 5, 8, 7),
site02 = c(5, 23, 4, 41),
site03 = c(12, 0, 0, 0)
),
Onubilalis = list(
site01 = c(12, 1, 2, 3),
site02 = c(0, 0, 0, 1),
site03 = c(1, 1, 2, 3)
)
)listbddInsect[[1]][[2]]## [1] 5 23 4 41
bddInsect$Snonagrioides$site02## [1] 5 23 4 41
bddInsect[['Snonagrioides']][['site02']]## [1] 5 23 4 41
listnames(bddInsect)## [1] "Snonagrioides" "Onubilalis"
names(bddInsect[[1]])## [1] "site01" "site02" "site03"
listbddInsect[[1]][[2]]## [1] 5 23 4 41
is.list(bddInsect[[1]][[2]])## [1] FALSE
bddInsect[[1]][2]## $site02
## [1] 5 23 4 41
is.list(bddInsect[[1]][2])## [1] TRUE
listbddInsect[[1]][c(1, 2)]## $site01
## [1] 12 5 8 7
##
## $site02
## [1] 5 23 4 41
bddInsect[['Snonagrioides']][c("site01", "site02")]## $site01
## [1] 12 5 8 7
##
## $site02
## [1] 5 23 4 41
listprint(miList02)## [[1]]
## [1] 5
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
listmiList02[[1]] <- 12
print(miList02)## [[1]]
## [1] 12
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
listprint(bddInsect)## $Snonagrioides
## $Snonagrioides$site01
## [1] 12 5 8 7
##
## $Snonagrioides$site02
## [1] 5 23 4 41
##
## $Snonagrioides$site03
## [1] 12 0 0 0
##
##
## $Onubilalis
## $Onubilalis$site01
## [1] 12 1 2 3
##
## $Onubilalis$site02
## [1] 0 0 0 1
##
## $Onubilalis$site03
## [1] 1 1 2 3
listbddInsect[['Snonagrioides']][['site02']] <- c(2, 4, 6, 8)
print(bddInsect)## $Snonagrioides
## $Snonagrioides$site01
## [1] 12 5 8 7
##
## $Snonagrioides$site02
## [1] 2 4 6 8
##
## $Snonagrioides$site03
## [1] 12 0 0 0
##
##
## $Onubilalis
## $Onubilalis$site01
## [1] 12 1 2 3
##
## $Onubilalis$site02
## [1] 0 0 0 1
##
## $Onubilalis$site03
## [1] 1 1 2 3
listmiList0203 <- c(miList02, miList03)
print(miList0203)## [[1]]
## [1] 12
##
## [[2]]
## [1] "qwerty"
##
## [[3]]
## [1] 4 5 6
##
## [[4]]
## [1] "a" "b" "c"
##
## [[5]]
## [1] 5
##
## [[6]]
## [1] "qwerty"
##
## [[7]]
## [[7]][[1]]
## [1] 4 5 6
##
## [[7]][[2]]
## [1] "a" "b" "c"
listmiList05 <- list("a", c("b", "c"), "d")
print(miList05)## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b" "c"
##
## [[3]]
## [1] "d"
unlist(miList05)## [1] "a" "b" "c" "d"
listprint(miList05)## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b" "c"
##
## [[3]]
## [1] "d"
listmiList05 <- c(miList05, "e")
print(miList05)## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b" "c"
##
## [[3]]
## [1] "d"
##
## [[4]]
## [1] "e"
listprint(miList05)## [[1]]
## [1] "a"
##
## [[2]]
## [1] "b" "c"
##
## [[3]]
## [1] "d"
##
## [[4]]
## [1] "e"
listmiList05[[2]] <- NULL
print(miList05)## [[1]]
## [1] "a"
##
## [[2]]
## [1] "d"
##
## [[3]]
## [1] "e"
data.framedata.frameEl contenedor data.frame se puede comparar a una tabla. Es en realidad un caso especial de list donde todos los elementos de la list tienen el mismo tamaño.
data.framemiDf01 <- data.frame(
numbers = c(1, 2, 3, 4),
logicals = c(TRUE, TRUE, FALSE, TRUE),
characters = c("a", "b", "c", "d")
)
print(miDf01)## numbers logicals characters
## 1 1 TRUE a
## 2 2 TRUE b
## 3 3 FALSE c
## 4 4 TRUE d
data.framenumbers <- c(1, 2, 3, 4)
logicals <- c(TRUE, TRUE, FALSE, TRUE)
characters <- c("a", "b", "c", "d")
miDf01 <- data.frame(numbers, logicals, characters)
print(miDf01)## numbers logicals characters
## 1 1 TRUE a
## 2 2 TRUE b
## 3 3 FALSE c
## 4 4 TRUE d
data.framestr(miDf01)## 'data.frame': 4 obs. of 3 variables:
## $ numbers : num 1 2 3 4
## $ logicals : logi TRUE TRUE FALSE TRUE
## $ characters: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
data.framePor defecto, data.frame transforma character en factor
str(miDf01)## 'data.frame': 4 obs. of 3 variables:
## $ numbers : num 1 2 3 4
## $ logicals : logi TRUE TRUE FALSE TRUE
## $ characters: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
data.framemiDf01 <- data.frame(
numbers = c(1, 2, 3, 4),
logicals = c(TRUE, TRUE, FALSE, TRUE),
characters = c("a", "b", "c", "d"),
stringsAsFactors = FALSE
)data.framestr(miDf01)## 'data.frame': 4 obs. of 3 variables:
## $ numbers : num 1 2 3 4
## $ logicals : logi TRUE TRUE FALSE TRUE
## $ characters: chr "a" "b" "c" "d"
data.framemiDf01 <- data.frame(
numbers = c(1, 2, 3, 4),
logicals = c(TRUE, TRUE, FALSE, TRUE),
characters = c("a", "b", "c", "d")
)
miDf01$characters <- as.character(miDf01$characters)data.framestr(miDf01)## 'data.frame': 4 obs. of 3 variables:
## $ numbers : num 1 2 3 4
## $ logicals : logi TRUE TRUE FALSE TRUE
## $ characters: chr "a" "b" "c" "d"
data.frameNota: “0” y “1” no son logical por defecto
Nota: Tratamientos “1”, “2”, “3” no son factor por defecto
data.framemiExpe <- data.frame(
tratamiento = c(1, 1, 2, 2, 3, 3),
resultado = c(0, 1, 0, 0, 1, 0)
)
str(miExpe)## 'data.frame': 6 obs. of 2 variables:
## $ tratamiento: num 1 1 2 2 3 3
## $ resultado : num 0 1 0 0 1 0
data.framemiExpe$tratamiento <- as.factor(miExpe$tratamiento)
miExpe$resultado <- as.logical(miExpe$resultado)
str(miExpe)## 'data.frame': 6 obs. of 2 variables:
## $ tratamiento: Factor w/ 3 levels "1","2","3": 1 1 2 2 3 3
## $ resultado : logi FALSE TRUE FALSE FALSE TRUE FALSE
data.framestr()
data.frameEl acceso a los diferentes valores de un data.frame se puede hacer de la misma manera que para un contenedor de tipo list.
miDf01$numbers # vector## [1] 1 2 3 4
miDf01[[1]] # vector## [1] 1 2 3 4
miDf01[["numbers"]] # vector## [1] 1 2 3 4
data.framemiDf01[1] # list## numbers
## 1 1
## 2 2
## 3 3
## 4 4
miDf01["numbers"] # list## numbers
## 1 1
## 2 2
## 3 3
## 4 4
data.framemyRow <- 2
myCol <- 1
miDf01[myRow, myCol]## [1] 2
data.framemiDf01[myRow, ]## numbers logicals characters
## 2 2 TRUE b
miDf01[, myCol]## [1] 1 2 3 4
miDf01[, "numbers"]## [1] 1 2 3 4
data.framemiDf01[, c(1, 2)]## numbers logicals
## 1 1 TRUE
## 2 2 TRUE
## 3 3 FALSE
## 4 4 TRUE
miDf01[c(2, 1), ]## numbers logicals characters
## 2 2 TRUE b
## 1 1 TRUE a
data.framemiDf01[miDf01$numbers > 2, ]## numbers logicals characters
## 3 3 FALSE c
## 4 4 TRUE d
miDf01[(miDf01$logicals == TRUE) & (miDf01$numbers < 2), ]## numbers logicals characters
## 1 1 TRUE a
data.framemiDf01[(miDf01$numbers %% 2) == 0, ]## numbers logicals characters
## 2 2 TRUE b
## 4 4 TRUE d
miDf01[((miDf01$numbers %% 2) == 0) | (miDf01$logicals == TRUE), ]## numbers logicals characters
## 1 1 TRUE a
## 2 2 TRUE b
## 4 4 TRUE d
data.frameprint(miDf01)## numbers logicals characters
## 1 1 TRUE a
## 2 2 TRUE b
## 3 3 FALSE c
## 4 4 TRUE d
data.framemiDf01$otraColumna <- c(4, 5, 6, 7)
print(miDf01)## numbers logicals characters otraColumna
## 1 1 TRUE a 4
## 2 2 TRUE b 5
## 3 3 FALSE c 6
## 4 4 TRUE d 7
data.framemiDf01$numbers <- miDf01$numbers + 100
print(miDf01)## numbers logicals characters otraColumna
## 1 101 TRUE a 4
## 2 102 TRUE b 5
## 3 103 FALSE c 6
## 4 104 TRUE d 7
data.framecolnames(miDf01)## [1] "numbers" "logicals" "characters" "otraColumna"
rownames(miDf01)## [1] "1" "2" "3" "4"
data.framemiDf01 <- rbind(miDf01,
otraLinea = data.frame(
numbers = 5,
logicals = TRUE,
characters = "e",
otraColumna = 8))data.frameprint(miDf01)## numbers logicals characters otraColumna
## 1 101 TRUE a 4
## 2 102 TRUE b 5
## 3 103 FALSE c 6
## 4 104 TRUE d 7
## otraLinea 5 TRUE e 8
data.framerownames(miDf01)## [1] "1" "2" "3" "4" "otraLinea"
rownames(miDf01) <- c("R1", "R2", "R3", "R4", "R5")data.frameprint(miDf01)## numbers logicals characters otraColumna
## R1 101 TRUE a 4
## R2 102 TRUE b 5
## R3 103 FALSE c 6
## R4 104 TRUE d 7
## R5 5 TRUE e 8
data.framemiVec <- c(1, 2, 3)
as.data.frame(miVec)## miVec
## 1 1
## 2 2
## 3 3
data.framePodemos hacer mucho más con un data.frame y volveremos a su manejo y operaciones posibles en el capítulo sobre funciones…
matrixmatrixEl contenedor matrix se puede ver como un vector de dos dimensiones: líneas y columnas. Corresponde a una matriz en matemáticas, y puede contener solo un tipo de datos (logical, numeric, character, …).
matrixvecForMatrix <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
miMat <- matrix(vecForMatrix, nrow = 3, ncol = 4)
print(miMat)## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
matrixnrow o ncol
vecForMatrix <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
miMat <- matrix(vecForMatrix, nrow = 3)
print(miMat)## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
matrixmiMat <- matrix(
vecForMatrix,
nrow = 3,
byrow = TRUE)
print(miMat)## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
matrixmiMat <- matrix(
vecForMatrix,
nrow = 3,
byrow = TRUE,
dimnames = list(
c("r1", "r2", "r3"),
c("c1", "c2", "c3", "c4"))
)
print(miMat)## c1 c2 c3 c4
## r1 1 2 3 4
## r2 5 6 7 8
## r3 9 10 11 12
matrixvecForMat01 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
vecForMat02 <- vecForMat01 * 10
vecForMat03 <- vecForMat01 / 10
dfForMat <- data.frame(vecForMat01, vecForMat02, vecForMat03)
print(dfForMat)## vecForMat01 vecForMat02 vecForMat03
## 1 1 10 0.1
## 2 2 20 0.2
## 3 3 30 0.3
## 4 4 40 0.4
## 5 5 50 0.5
## 6 6 60 0.6
## 7 7 70 0.7
## 8 8 80 0.8
## 9 9 90 0.9
## 10 10 100 1.0
## 11 11 110 1.1
## 12 12 120 1.2
matrixis.matrix(dfForMat)## [1] FALSE
as.matrix(dfForMat)## vecForMat01 vecForMat02 vecForMat03
## [1,] 1 10 0.1
## [2,] 2 20 0.2
## [3,] 3 30 0.3
## [4,] 4 40 0.4
## [5,] 5 50 0.5
## [6,] 6 60 0.6
## [7,] 7 70 0.7
## [8,] 8 80 0.8
## [9,] 9 90 0.9
## [10,] 10 100 1.0
## [11,] 11 110 1.1
## [12,] 12 120 1.2
matrix# operaciones término a término
miMat01 <- matrix(vecForMat01, ncol = 3)
miVecOp <- c(1, 10, 100, 1000)
miMat01 * miVecOp## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 20 60 100
## [3,] 300 700 1100
## [4,] 4000 8000 12000
matrix# operaciones término a término
miMat01 / miMat01## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 1 1 1
## [3,] 1 1 1
## [4,] 1 1 1
miMat01 - 10## [,1] [,2] [,3]
## [1,] -9 -5 -1
## [2,] -8 -4 0
## [3,] -7 -3 1
## [4,] -6 -2 2
matrix# operaciones algebraicas
miVecConf <- c(1, 10, 100)
miMat01 %*% miVecConf## [,1]
## [1,] 951
## [2,] 1062
## [3,] 1173
## [4,] 1284
matrixmiMat02 <- matrix(
c(1, 2, 3, 4, 5, 6, 7, 8, 9),
ncol = 3)matrixLa diagonal de una matrix: diag().
print(miMat02)## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
diag(miMat02)## [1] 1 5 9
matrixTransposición de matrix (columnas en líneas o líneas en columnas).
aperm(miMat01)## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
t(miMat01)## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
matrixi <- 2
j <- 1
miMat01[i, j]## [1] 2
miMat01[i, ]## [1] 2 6 10
miMat01[, j]## [1] 1 2 3 4
matrixmiMat01[c(1, 2), c(2, 3)]## [,1] [,2]
## [1,] 5 9
## [2,] 6 10
miMat01[10]## [1] 10
arrayarrayEl contenedor array es una generalización del contenedor de tipo matrix. Donde el tipo matrix tiene dos dimensiones (líneas y columnas), el tipo array tiene un número indefinido de dimensiones. Podemos saber el número de dimensiones de un array (y por lo tanto una matrix) con la función dim().
dim(miMat01)## [1] 4 3
arraymiVecArr <- 1:24
miArray <- array(miVecArr, dim = c(3, 4, 2))
print(miArray)## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 13 16 19 22
## [2,] 14 17 20 23
## [3,] 15 18 21 24
arraymiArray02 <- array(1:24,
dim = c(3, 4, 2),
dimnames = list(
c("r1", "r2", "r3"),
c("c1", "c2", "c3", "c4"),
c("matrix1", "matrix2")
)
)
print(miArray02)## , , matrix1
##
## c1 c2 c3 c4
## r1 1 4 7 10
## r2 2 5 8 11
## r3 3 6 9 12
##
## , , matrix2
##
## c1 c2 c3 c4
## r1 13 16 19 22
## r2 14 17 20 23
## r3 15 18 21 24
arrayi <- 2
j <- 1
k <- 1
miArray02[i, j, k]## [1] 2
miArray02[, j, k]## r1 r2 r3
## 1 2 3
arraymiArray02[i, , k]## c1 c2 c3 c4
## 2 5 8 11
miArray02[i, j, ]## matrix1 matrix2
## 2 14