Matrizes
Para uma revisão sobre matrizes na Álgebra Linear veja Matrizes
Uma matriz é um objeto de duas dimensões, um conjunto de elementos organizados em linhas e colunas. Todos os componentes de uma matriz devem ser do mesmo tipo. Uma matriz Mm×n contém m linhas e n colunas. Em R uma matriz pode ser criada à partir de um vetor, através da função matrix():
> # Criando uma matriz de 4 linhas e 5 colunas
> n <- matrix(1:20, nrow=4, ncol=5)
> n
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> # Por default as colunas são preenchidas por colunas.
> # Para preencher por linhas fazemos
> m <- matrix(1:20, nrow=4, ncol=5, byrow=TRUE)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20
> # Os elementos podem ser lidos diretamente
> m[3,4]
[1] 14
> # A n-ésima linha pode ser obtida (fazendo n=2)
> m[2,]
[1] 6 7 8 9 10
> # A n-ésima coluna pode ser obtida (n=3)
> m[,3]
[1] 3 8 13 18
> # O segundo elemento da terceira coluna é
> m[,3][2]
[1] 8
> # O mesmo que
> m[2,3]
[1] 8
> # Mais de uma coluna pode ser extraída
> # Extraindo a 1a e 3a coluna da matriz m
> m [, c(1,3)]
[,1] [,2]
[1,] 1 3
[2,] 6 8
[3,] 11 13
[4,] 16 18
> # Uma matrix também pode ser declarada sem ter seus elementos definidos
> matr <- matrix(nrow=3,ncol=2)
> matr
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] NA NA
> # NA é a forma de R representar que o valor não está disponível
> # A matrix pode ser populada em seguida:
> matr[1,1] <- 1
> matr[1,2] <- 4 # etc.
> # Matrizes, como vetores, possuem atributos.
> attributes(m)
$ dim
[1] 4 5
> # A matriz m possui apenas o atributo dimensão
> dim(m)
[1] 4 5
> # 4 linhas e 5 colunas.
> # Uma matriz pode ser criada associando-se dimensões à um vetor
> k <- 1:10
> k
[1] 1 2 3 4 5 6 7 8 9 10
> dim(k) <- c(2,5)
> k
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> # Finalmente matrizes podem ser criadas por agrupamento de colunas
> x <- 1:3
> y <- 10:12
> cbind(x,y)
x y
[1,] 1 10
[2,] 2 11
[3,] 3 12
> # ou agrupamento de linhas
> rbind(x,y)
[,1] [,2] [,3]
x 1 2 3
y 10 11 12
> # Os argumentos de rbind e cbind são vetores ou matrizes.
> # Por ex., se xy = rbind(x,y) então
> rbind(x,xy)
[,1] [,2] [,3]
x 1 2 3
x 1 2 3
y 10 11 12
> # As dimensões devem ser compatíveis ou os argumentos podem ser truncados
> rbind(xy, 100:104)
[,1] [,2] [,3]
x 1 2 3
y 10 11 12
100 101 102
Warning message:
In rbind(xy, 100:104) :
number of columns of result is not a multiple of vector length (arg 2)
> # Uma mensagem de erro foi gerada.
>
> # Uma matrix pode ser criada com atributos m linhas, n colunas
> # juntamente com nomes para as linhas e colunas
> celulas <- c(11, 12, 21, 22)
> nomesLinhas <- c("Linha 1", "Linha 2")
> nomesColunas <- c("Coluna 1", "Coluna 2")
> matriz <- matrix(celulas, nrow=2, ncol=2, byrow=TRUE,
dimnames=list(nomesLinhas, nomesColunas))
> matriz
Coluna 1 Coluna 2
Linha 1 11 12
Linha 2 21 22
>
> # Esta matriz tem atributos dim (dimensões 2X2) e dimnames
> attributes(matriz)
$dim
[1] 2 2
$dimnames
$dimnames[[1]]
[1] "Linha 1" "Linha 2"
$dimnames[[2]]
[1] "Coluna 1" "Coluna 2"
> # Os nomes das linhas e colunas podem ser lidos e alterados
> colnames(matriz)
[1] "Coluna 1" "Coluna 2"
> colnames(matriz) <- c("col1", "col2")
> row.names(matriz)
[1] "Linha 1" "Linha 2"
> row.names(matriz) <- c("lin1" , "lin2")
> # Agora a matriz tem novos atributos names
> matriz
col1 col2
lin1 11 12
lin2 21 22
> # O nome de uma linha (ou coluna) pode ser alterado isoladamente
> row.names(matriz)[2] <- "linha dois"
> matriz
col1 col2
lin1 11 12
linha dois 21 22
Os seguintes funções foram usadas para a criação, acesso e manipulação de matrizes:
| Função | Efeito |
|---|---|
| M = matrix(vetor, nrow=m, ncol=n, byrow=TRUE) | cria matriz Mm x n usando os elementos do vetor, distribuídos por linhas |
| matriz[m,n] | retorna o elemento Mm,n |
| matriz[m,n] <- q | associa o valor q ao elemento Mm,n |
| matriz[m,] | retorna a m-ésima linha da matriz M |
| matriz[,n] | retorna a n-ésima coluna da matriz M |
| attributes(M) | exibe atributos da matriz M |
| rbind(x, y) | junta por linhas os objetos x, y |
| cbind(x, y) | junta por colunas os objetos x, y |
| colnames(M) | exibe (ou atribue) nomes para as colunas de M |
| row.names(M) | exibe (ou atribue) nomes para as linhas de M |
Arrays
Arrays são generalizações dos objetos matrizes e são manipulados de forma semelhante. Um array de dimensões 2 × 3 × 5 pode ser visto como uma coleção de 5 matrizes 2 × 3. Para efeito de sua representação no console elas são representadas exatamente desta forma.
> arr <- array(1:12, c(2, 3, 2))
> arr
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> # Como vemos acima o componente [,, 2] é uma matriz 2 por 3
> arr[,,2]
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> # que tem na primeira linha e segunda coluna o valor
> arr[,,2][1,2]
[1] 9
>
> # Um array pode ser construído com seus atributos names
> # Um ex, a terceira dimensão do array representa valores em anos diversos
> dim1 <- c("Filho 1","Filho 2")
> dim2 <- c("Educação", "Saúde", "Alimentação")
> dim3 <- c("2010", "2011")
> Despesas <- array(, c(2, 3, 2), dimnames=list(dim1, dim2, dim3))
> # Todos os elementos são 'NA'Despesas
> Despesas[1,1,1]<-90.80
> Despesas[1,1,2]<-98.80
> Despesas
, , 2010
Educação Saúde Alimentação
Filho 1 90.8 NA NA
Filho 2 NA NA NA
, , 2011
Educação Saúde Alimentação
Filho 1 98.8 NA NA
Filho 2 NA NA NA
> Despesas["Filho 1",,]
2010 2011
Educação 90.8 98.8
Saúde NA NA
Alimentação NA NA
> Despesas["Filho 1","Saúde","2010"]<-456
> Despesas["Filho 1","Saúde","2010"]
[1] 456
> Despesas["Filho 1",,]
2010 2011
Educação 90.8 98.8
Saúde 456.0 NA
Alimentação NA NA