Tipos de objetos e Operações básicas - Matrizes

Treinamento em Programação no Ambiente R


GUIA DO MOCHILEIRO DO UNIVERSO R

As matrizes são outra classe de objetos muito utilizadas no R, com elas podemos realizar operações de maior escala de forma automatizada.

Por serem usadas em operações, normalmente armazenamos nelas elementos numéricos. Para criar uma matriz, determinamos uma sequência de números e indicamos o número de linhas e colunas da matriz:

X <- matrix(1:12, nrow = 6, ncol = 2)
X

Podemos também utilizar sequências já armazenadas em vetores para gerar uma matriz, desde que eles sejam numéricos:

x <- c(30.1,30.4,40,30.2,30.6,40.1)
y = c(0.26,0.3,0.36,0.24,0.27,0.35)

W <- matrix(c(x,y), nrow = 6, ncol =2)
W

Com elas podemos realizar operações matriciais:

X*2
X*X        
X%*%t(X)          # Multiplicação matricial, t()- Matriz Transposta

Utilizar essas operações exige conhecimento de álgebra de matrizes, se quiser se aprofundar a respeito, o livro Linear Models in Statistics, Rencher (2008) possui um boa revisão à respeito. Você também pode explorar a sintaxe do R para essas operações neste link.

Acessamos os números internos à matriz dando as coordenadas [linha,coluna], como no exemplo:

W[4,2] # Número posicionado na linha 4 e coluna 2

As vezes pode ser informativo dar nomes às colunas e às linhas da matriz, fazemos isso com:

colnames(W) <- c("altura", "diametro")
rownames(W) <- clone
W

Essas funções colnames e rownames também funcionam nos data.frames.

Data.frames

Diferente das matrizes, não realizamos operações com os data.frames, mas eles permitem a união de vetores com classes diferentes. Os data frames são semelhantes a tabelas geradas em outros programas, como o excel.

Os data frames são combinações de vetores de mesmo comprimento. Todos os que criamos até agora tem tamanho 6, verifique.

Podemos assim combiná-los em colunas de um único data.frame:

campo1 <- data.frame("clone" = clone,     # Antes do sinal de "="  
                     "altura" = x,        # estabelecemos os nomes  
                     "diametro" = y,      # das colunas
                     "idade" = rep(3:5, 2),
                     "corte"= logico) 
campo1

Podemos acessar cada uma das colunas com:

campo1$idade

Ou também com:

campo1[,4] 

Aqui, o número dentro dos colchetes se refere à coluna, por ser o segundo elemento (separado por vírgula). O primeiro elemento se refere à linha. Como deixamos o primeiro elemento vazio, estaremos nos referindo a todas as linhas para aquela coluna.

Dessa forma, se quisermos obter um conteúdo específico podemos dar as coordenadas com [linha,coluna]:

campo1[1,2] 
  • Obtenha o diâmetro do clone “URO03.

campo1[3,3]

Mesmo se tratando de um data frame, podemos realizar operações com os vetores numéricos que a compõe.

  • Com o diâmetro e a altura das árvores, calcule o volume conforme a fórmula a seguir e armazene em um objeto volume:

\(3.14*(diametro/2)^2*altura\)

volume <- 3.14*((campo1\(diametro/2)^2)*campo1\)altura

Agora, vamos adicionar o vetor calculado com o volume ao nosso data.frame. Para isso use a função cbind.

campo1 <- cbind(campo1, volume)
str(campo1)

Algumas dicas:

  • Lembre-se que, para construir matrizes e data frames, o número de elementos em cada coluna tem que ser iguais.
  • Caso não saiba o operador ou a função que deve ser utilizada, como o desvio padrão, busque no google algo como “desvio padrão R”, ou melhor “standard deviation R”. Logo nas primeiras páginas você obterá respostas. A comunidade do R é bastante ativa e grande parte das suas perguntas sobre ele já foram respondidas em algum lugar da web.
  • Não esqueça que tudo o que fizer no R precisa ser explicitamente indicado, como uma multiplicação 4ac com 4*a*c. Para gerar um vetor 1,3,2,6 é necessário: c(1,3,2,6).

Importando matrizes

Baixe o arquivo aqui

getwd()
cafe <- read.delim2("cafe.txt")
cafe <- read.table(header = T,"cafe.txt")
cafe <- read.csv("cafe.txt")

Salvando matrizes

getwd()
cafe <- write.table("cafe.txt")
cafe <- write.csv("cafe.csv")

Listas

Listas consistem em uma coleção de objetos, não necessariamente de mesma classe. Nelas podemos armazenar todos os outros objetos já vistos e recuperá-los pela indexação com [[. Como exemplo, vamos utilizar alguns objetos que já foram gerados.

minha_lista <- list(campo1 = campo1, media_alt = tapply(campo1$altura, campo1$idade, mean), matrix_ex = W)
str(minha_lista)

Quero acessar o data.frame campo1

minha_lista[[1]] 
# ou
minha_lista$campo1

Para acessar uma coluna específica no data.frame campo1, que está dentro da minha_lista:

minha_lista[[1]][[3]]
# ou
minha_lista[[1]]$diametro
# ou
minha_lista$campo1$diametro

Listas são muito úteis, por exemplo, quando vamos utilizar/gerar diversos objetos dentro de um loop.

Arrays

Este é um tipo de objeto que você provavelmente não irá utilizar agora no início, mas é bom saber da sua existência. São utilizados para armazenar dados com mais de duas dimensões. Por exemplo, se criarmos um array:

(meu_array <- array(1:24, dim = c(2,3,4)))

Teremos quatro matrizes com duas linhas e três colunas e os números de 1 a 24 estarão distribuídos nelas por colunas.

Paramos aqui.