Matrizes e Arrays

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


Listas e fatores.

Leave a Reply

Your email address will not be published. Required fields are marked *