1. Faculdade de Economia
Universidade do Porto
Introdu¸˜o ` Programa¸˜o em R
ca a ca
Lu´ Torgo
ıs
ltorgo@liacc.up.pt
Grupo de Matem´tica e Inform´tica
a a
Outubro de 2006
4. 4.4.7 Parˆmetros de Gr´ficos . . . . . . . . . . . . . . . . . . . . . . . .
a a 90
4.4.8 a a ´
Dividir a Janela de Gr´ficos em V´rias Areas . . . . . . . . . . . . 91
Referˆncias
e 95
´
Indice 97
5. Pref´cio
a
Este documento tem como objectivo principal fornecer uma introdu¸˜o ` programa¸˜o
ca a ca
usando a linguagem R. A escolha desta linguagem como ve´ ıculo para aprender a pro-
gramar prende-se com os objectivos do curso em que esta disciplina se insere. Uma vez
que este curso tem a an´lise de dados e o data mining como um dos assuntos centrais,
a
o R sendo tamb´m um ambiente de an´lise explorat´ria de dados, permite uma melhor
e a o
articula¸˜o com outras disciplinas.
ca
A escolha do R tem ainda outros motivos relacionados com o facto de este ser um
software gratuito e de c´digo aberto. Estas caracter´
o ısticas, em conjunto com as suas
reconhecidas qualidades, fazem dele uma ferramenta quase ideal para aprender a progra-
mar dentro dum contexto de an´lise de dados e sistemas de apoio ` decis˜o. Ao usarem
a a a
uma ferramenta deste g´nero como plataforma de implementa¸˜o dos conceitos apren-
e ca
didos, os alunos poder˜o facilmente, pelo seu car´cter gratuito, levar o que aprenderam
a a
para o cen´rio profissional em que se enquadram ou venham a enquadrar. Al´m disso,
a e
as suas caracter´
ısticas de c´digo aberto ir˜o facilitar a eventual necessidade de adaptar
o a
algum dos muitos m´todos dispon´
e ıveis no R, para assim melhor os adequarem aos seus
interesses/objectivos.
7. 7
1 Introdu¸˜o ao Ambiente R
ca
O R (R Development Core Team, 2006) ´ ao mesmo tempo uma linguagem de programa-
e O que ´ o R?
e
ca
¸˜o e um ambiente para computa¸˜o estat´
ca ıstica e gr´ficos. Trata-se de uma linguagem de
a
programa¸˜o especializada em computa¸˜o com dados. Uma das suas principais caracte-
ca ca
r´
ısticas ´ o seu car´cter gratuito e a sua disponibilidade para uma gama bastante variada
e a
de sistemas operativos. Neste documento iremos concentrar a nossa aten¸˜o na vers˜o
ca a
Windows, mas basicamente tudo o que aqui ´ descrito tamb´m se aplica `s outras vers˜es,
e e a o
dadas as muito reduzidas diferen¸as entre as vers˜es para as diversas plataformas.
c o
Apesar do seu car´cter gratuito o R ´ uma ferramenta bastante poderosa com boas
a e
capacidades ao n´ ıvel da programa¸˜o e um conjunto bastante vasto (e em constante
ca
crescimento) de packages que acrescentam bastantes potencialidades ` j´ poderosa vers˜o
a a a
base do R.
O R ´ uma variante da linguagem S com a qual John Chambers (Chambers, 1998)
e
ganhou o prestigiado pr´mio de software da organiza¸˜o ACM.
e ca
1.1 Instala¸˜o do R
ca
Embora o R esteja instalado no sistema inform´tico da FEP, dado o seu car´cter gra-
a a
tuito, os alunos poder˜o instalar este software nos seus computadores em casa. Para isso
a
necessitar˜o simplesmente de ligar o computador ` Internet e seguir os passos que des-
a a
crevemos em seguida. Caso n˜o pretenda realizar a instala¸˜o do R no seu computador,
a ca
poder´ avan¸ar para a pr´xima sec¸˜o.
a c o ca
Para instalar o R os alunos dever˜o come¸ar por ligar o seu computador ` Internet.
a c a
Ap´s esta liga¸˜o dever´ ser feito o download do R a partir do site desta aplica¸˜o,
o ca a ca Download do R
http://www.r-project.org. Neste site dever´ ser seguido o link com o nome CRAN
a
no menu dispon´ ` esquerda. Depois de escolher um dos muitos locais espalhados pelo
ıvel a
mundo para fazer o download, dever´ seguir o link Windows (95 and later) dispon´
a ıvel
na sec¸˜o Precompiled Binary Distributions. No ´cran seguinte, deve “entrar” na pasta
ca e
base e fazer o download do ficheiro R-2.3.1-win32.exe1 .
Uma vez efectuado o download do ficheiro mencionado acima, dever´ proceder-se `
a a
instala¸˜o do R , bastando para isso executar o ficheiro (carregando duas vezes em cima
ca Instala¸˜o do R
ca
dele no Explorer). De notar que em vers˜es mais recentes do Windows esta instala¸˜o
o ca
poder´ ter de ser feita pelo utilizador Administrador, por quest˜es de permiss˜es.
a o o
1.2 Come¸ar a usar o R
c
Para se executar o R basta usar ou o ´ıcone que normalmente est´ dispon´ no desktop
a ıvel Iniciar o R
do Windows, ou ent˜o usar o respectivo item no menu “Start”2 .
a
A execu¸˜o do R faz aparecer a janela desta aplica¸˜o de que se pode ver um exemplo
ca ca
na Figura 1.
`
A parte os menus que iremos explorar mais tarde, esta janela apresenta o prompt
a ´
do R (> ), com o cursor ` sua frente. E aqui que vamos introduzir os comandos que O prompt do R
pretendemos que o R execute. Podemos come¸ar por ver um pequeno exemplo do tipo de
c
interac¸˜o que vamos ter com o R, escrevendo o seguinte comando no prompt e carregando
ca
em seguida na tecla Enter (esta ´ a forma de mandar o R executar o comando que
e Executar comandos
acabamos de escrever),
> R.version
platform i386-pc-mingw32
arch i386
os mingw32
system i386, mingw32
status
1 O nome do ficheiro poder´ variar em vers˜es posteriores do R. Na altura da escrita deste texto a
a o
vers˜o do R dispon´
a ıvel era a 2.3.1 e da´ o nome do ficheiro.
ı
2 Na FEP o R est´ dispon´
a ıvel seguindo o percurso de menus: Start->Programs->Aplications->R.
8. 8 1 ¸˜
INTRODUCAO AO AMBIENTE R
Figura 1: O ambiente R.
major 2
minor 3.1
year 2006
month 06
day 01
svn rev 38247
language R
version.string Version 2.3.1 (2006-06-01)
O comando R.version ao ser executado fez aparecer uma s´rie de informa¸˜o sobre
e ca
a vers˜o do R bem como sobre o computador onde o R est´ a ser executado.
a a
Terminar o R Para terminar a execu¸˜o do R basta executar o seguinte comando,
ca
> q()
Ao executar este comando ir´ aparecer uma caixa de di´logo como a apresentada na
a a
Continuar o Figura 2. Se respondermos Yes a esta pergunta o R vai guardar a informa¸˜o contida na
ca
trabalho mais tarde mem´ria do computador num ficheiro, de modo a que da pr´xima vez que executarmos o
o o
R no local onde esse ficheiro ´ guardado, ele vai permitir-nos continuar o nosso trabalho
e
exactamente de onde o estamos a abandonar ao executar o comando q(). A informa¸˜o ca
guardada consiste basicamente na hist´ria de comandos que executamos nesta sess˜o que
o a
agora terminamos, bem como os objectos que criamos na nossa sess˜o. O resultado ser´
a a
que o R vai criar 2 ficheiros: um chamado .Rhistory contendo a lista dos comandos que
executamos, e outro chamado .RData contendo os objectos criados na sess˜o. Gravar a
a
sess˜o s´ ter´ interesse se de facto pretendermos continuar o que est´vamos a fazer mais
a o a a
tarde. Na maior parte das vezes vamos escolher a op¸˜o No que ir´ abandonar o R sem
ca a
guardar o estado em que est´vamos. Os ficheiros com o estado da sess˜o s˜o sempre
a a a
gravados no direct´rio actual onde o R est´ a funcionar. Para saber o direct´rio actual
o a o
do R basta fazer no prompt,
> getwd()
Em resposta a este comando o R ir´ apresentar no ´cran o direct´rio actual. Para o
a e o
Alterar o direct´rio
o alterar poder-se-´ ou usar a op¸˜o Change dir... do menu File, ou ent˜o usar a fun¸˜o
a ca a ca
actual setwd() conforme ilustrado no exemplo seguinte,
> setwd('U:My DocumentsAulasR')
Note a utiliza¸˜o de dois caracteres , em vez do unico caracter como ´ costume em
ca ´ e
ambientes Windows3 .
3 Acrescente-se a t´
ıtulo de curiosidade que poder´ ser usado em vez destes dois caracteres um unico
a ´
caracter “/”.
9. 1.3 Ajuda sobre o R 9
Figura 2: Abandonar o R.
1.3 Ajuda sobre o R
O R tem um sistema de ajuda bastante elaborado que lhe permitir´ obter muita informa-
a
ca
¸˜o extra sobre a linguagem, bem como muitos outros aspectos que lhe est˜o associados.
a Obter ajuda no R
Nas vers˜es Windows do R, a forma mais f´cil de obter ajuda ´ atrav´s da utiliza¸˜o
o a e e ca
do menu Help dispon´ ıvel na janela da aplica¸˜o R. Atrav´s deste menu ´ poss´
ca e e ıvel por
exemplo, escolher a op¸˜o Html help o que far´ lan¸ar um browser onde poder´ tirar
ca a c a
partido de uma s´rie de manuais e outros tipo de ajuda dispon´
e ıveis no R.
No entanto, se pretende simplesmente obter ajuda sobre uma fun¸˜o em particular
ca
do R, a forma mais simples ser´ provavelmente usar a fun¸˜o help(),
a ca
> help(sqrt)
Este comando ir´ fazer aparecer uma pequena janela com todo um conjunto de infor-
a
ma¸˜es uteis sobre a fun¸˜o escolhida, que vai da simples descri¸˜o dos seus argumentos
co ´ ca ca
at´ exemplos de utiliza¸˜o, bem como fun¸˜es relacionadas. Em alternativa, poder´
e ca co a
introduzir antes “? sqrt”, produzindo exactamente o mesmo efeito.
Quando n˜o sabemos o nome concreto da fun¸˜o sobre a qual preciamos de ajuda,
a ca
podemos usar como alternativas as fun¸oes apropos() e help.search(). Genericamente,
c˜
ambas produzem uma lista das fun¸˜es do R que contˆm referˆncias ao texto que incluimos
co e e
como argumento destas fun¸˜es. Experimente por exemplo fazer, apropos(’model’), ou
co
help.search(’model’).
Para d´vidas mais complexas poder´ ainda consultar a muita documenta¸˜o gratuita
u a ca
dispon´ ıvel no site do R (www.r-project.org), ou a mailing list de apoio dispon´ ıvel no
mesmo site. Se optar por esta ultima alternativa recomenda-se que antes de colocar
´
qualquer pergunta fa¸a uma procura pelos arquivos da lista para evitar colocar quest˜es
c o
j´ respondidas, o que nem sempre ´ bem recebido pelas pessoas que se voluntariam para
a e
ajudar.
Finalmente uma alternativa poderosa que junta v´rias destas formas de ajuda do R
a
´ utilizar no R a fun¸˜o RSiteSearch(). Esta fun¸˜o faz lan¸ar um browser que ir´
e ca ca c a
mostrar o resultado da procura da “string” que passar como argumento ` fun¸˜o. O
a ca
resultado da procura envolve toda a ajuda de todas as fun¸˜es do R, ajuda nas mailing
co
lists, bem como em outros documentos. Por exemplo, se pretendo saber o que existe
nestes locais sobre redes neuronais, poderia fazer a seguinte procura,
> RSiteSearch('neural networks')
1.4 “Packages” do R
Uma instala¸˜o do R vem j´ com um conjunto de packages instaladas. Estas packages n˜o
ca a a
s˜o mais do que agrega¸˜es de fun¸˜es que foram criadas por algu´m que as disponibilizou
a co co e
a
` comunidade de forma gratu´ Qualquer pessoa pode criar as suas packages e submetˆ-
ıta. e
las ao portal do R para que sejam consideradas na lista de packages dispon´ ıveis a´ı.
Quando se executa o R s´ algumas fun¸˜es est˜o dispon´
o co a ıveis de imediato. Essas s˜oa
as fun¸˜es inclu´
co ıdas nas packages que foram julgadas mais importantes ou de uso mais
comum e que s˜o automaticamente carregadas quando se executa o R. Em qualquer
a
altura poderemos “carregar” uma package que contenha fun¸˜es extra que necessitemos
co
para o nosso trabalho. Para tal ser poss´ ıvel a package dever´ estar instalada no nosso
a
computador. Se tal n˜o fˆr o caso teremos que fazer o download da mesma e instal´-la.
a o a
Este processo ´ simples, desde que o seu computador esteja ligado ` Internet.
e a
10. 10 1 ¸˜
INTRODUCAO AO AMBIENTE R
Para instalar uma nova package podemos usar a fun¸˜o install.packages(), que
ca Instalar novas
leva como argumento o nome da package a instalar4 . Depois de indicado um reposit´rio
o packages
de onde fazer o download da package o R ir´ encarregar-se de todo o processo, inclusiv´
a e
da sua instala¸˜o no seu computador.
ca
Usar packages Para utilizar packages que estejam dispon´
ıveis no seu sistema basta usar a fun¸˜o
ca
library(), por exemplo,
library(rpart)
Esta instru¸˜o faz com que a partir de agora passem a estar dispon´
ca ıveis para utiliza¸˜o,
ca
todos os objectos (fun¸˜es, dados, etc.) definidos nessa package. Cada package instalada
co
tem uma ajuda espec´ ıfica que pode ser obtida no sistema de ajuda HTML do R que foi
descrito na Sec¸˜o 1.3.
ca
4 Na realidade podemos instalar v´rias indicando um vector (c.f. Sec¸˜o 2.2) com nomes de packages.
a ca
11. 11
2 Fundamentos da Linguagem R
2.1 Os objectos do R
O R ´ uma linguagem baseada em objectos. Isto quer dizer que tudo o que n´s vamos
e o
usar no R est´ guardado na mem´ria do computador sob a forma de um objecto. Todos
a o
os objectos em R tˆm um nome associado e podem armazenar diferentes tipos de coisas
e Objectos do R
(n´meros, texto, vectores, matrizes, express˜es, chamadas a fun¸˜es, etc.).
u o co
Para armazenar algo num objecto usamos o operador de atribui¸˜o. Este operador
ca Operador de
consiste num sinal < seguido por um sinal -, como se vˆ no exemplo apresentado em se-
e atribui¸˜o
ca
guida, em que guardamos o n´mero 4.5 no objecto que resolvemos chamar taxa.de.juro,
u
> taxa.de.juro <- 4.5
Para ver o conte´do de um objecto (o que est´ guardado na mem´ria sob um deter-
u a o Ver o conte´ do de
u
minado nome) basta digitar o nome do objecto no prompt do R, carregando em seguida um objecto
em Enter. Como resposta o R mostra-nos o conte´do do objecto que lhe indicamos.
u
Por exemplo, suponhamos que queremos confirmar o conte´do do objecto taxa.de.juro,
u
> taxa.de.juro
[1] 4.5
O estranho [1] que aparece antes do n´mero guardado em taxa.de.juro, tem o
u
significado “esta linha est´ a mostrar o conte´do de taxa.de.juro a come¸ar no elemento
a u c
nº 1 do objecto”. O significado disto tornar-se-´ mais ´bvio quando virmos objectos que
a o
podem armazenar mais do que um elemento, como por exemplo um vector contendo 100
n´meros.
u
A opera¸˜o de atribui¸˜o ´ destrutiva no sentido que ao atribuir um novo valor a um
ca ca e
objecto j´ existente, vamos perder o conte´do que ele estava a armazenar anteriormente.
a u
> taxa.de.juro <- 3.9
> taxa.de.juro
[1] 3.9
Tamb´m podemos atribuir express˜es num´ricas a objectos. O resultado de tal ope-
e o e Express˜es
o
ra¸˜o ´ o de que o resultado do c´lculo da express˜o ´ colocado no objecto, e n˜o a
ca e a a e a num´ricas
e
express˜o propriamente dita,
a
> z <- 5
> w <- z^2
> w
[1] 25
> i <- (z * 2 + 45)/2
> i
[1] 27.5
Sempre que pretendemos atribuir o resultado de uma express˜o a um objecto e em
a
seguida ver o seu conte´do (como nos exemplos acima), podemos em alternativa usar a
u
seguinte sintaxe que nos poupa algum tempo,
> (w <- z^2)
[1] 25
12. 12 2 FUNDAMENTOS DA LINGUAGEM R
Na realidade n˜o ´ necess´rio atribuir o resultado das express˜es a objectos. Isto s´
a e a o o
far´ sentido se pretendermos usar o resultado do c´lculo mais tarde, por exemplo noutra
a a
express˜o. Se pretendermos saber simplesmente o resultado do c´lculo, podemos usar o
a a
R como uma esp´cie de calculadora,
e O R como uma
calculadora
> (34 + 90)/12.5
[1] 9.92
Sempre que criamos um novo objecto usando a instru¸˜o de atribui¸˜o, ele ir´ ficar na
ca ca a
mem´ria do computador. Como esta ´ limitada, poderemos apagar os objectos sempre
o e
Listar os objectos que n˜o precisarmos mais deles. Podemos ver quais os objectos actualmente na mem´ria
a o
em mem´ria
o do computador usando as fun¸˜es ls() ou objects(). Se j´ n˜o necessitamos de algum
co a a
dos objectos podemos ent˜o apag´-lo com a fun¸˜o rm() como nos exemplos apresentados
a a ca
em seguida,
> ls()
[1] "i" "taxa.de.juro" "w" "z"
> rm(taxa.de.juro)
> rm(z, w)
> objects()
[1] "i"
Nomes v´lidos
a O nome dos objectos pode ser formado por qualquer letra mai´scula ou min´scula,
u u
os d´
ıgitos 0 a 9 (excepto no in´ do nome), e tamb´m o ponto final “.”. Os nomes dos
ıcio e
objectos em R s˜o sens´
a ıveis `s letras mai´sculas / min´sculas. Isto quer dizer que Cor
a u u
e cor s˜o dois objectos diferentes para o R. Note tamb´m que n˜o pode usar espa¸os
a e a c
nos nomes dos objectos. Por exemplo, se pretende ter um objecto que guarda uma
determinada taxa de cˆmbio, poderia sentir-se tentado(a) a escolher o nome taxa de
a
cˆmbio para o objecto, o que iria gerar um erro do R,
a
> taxa de c^mbio <- 0.05
a
Error: syntax error
Em alternativa poderia usar o seguinte nome que j´ seria v´lido,
a a
> taxa.de.c^mbio <- 0.05
a
2.2 Vectores
O que ´ um vector
e O objecto mais b´sico do R para guardar dados ´ o vector. Um vector ´ uma estrutura
a e e
de dados que permite armazenar um conjunto de valores do mesmo tipo (por exemplo
n´meros) sob um mesmo nome. Esses elementos podem depois ser acedidos individu-
u
almente usando um esquema de indexa¸˜o que iremos descrever mais ` frente. Este
ca a
tipo de estrutura de dados ´ bastante util quando pretendemos armazenar v´rias coisas
e ´ a
relacionadas na mem´ria do computador. Por exemplo, suponhamos que pretendemos
o
guardar os lucros obtidos pela nossa empresa ao longo dos 12 meses do ano anterior.
Em vez de termos 12 objectos diferentes, cada um guardando o lucro em cada mˆs, uma
e
vez que s˜o n´meros relacionados uns com os outros, faz mais sentido guard´-los todos
a u a
numa mesma estrutura de dados, que neste caso ser´ um vector com 12 n´meros. Em R,
a u
mesmo quando atribu´ ımos um unico n´mero a um objecto (por exemplo fazendo x <-
´ u
45), estamos de facto a criar um vector de n´meros com um unico elemento.
u ´
Modo e tamanho Todos os vectores em R tˆm um modo e um tamanho. O modo determina o tipo de
e
dos vectores valores guardado no vector. Em R podemos ter vectores com modo character, logical,
numeric e complex. Ou seja, podemos ter vectores para armazenar os seguintes tipos
de dados at´micos: conjuntos de caracteres, valores l´gicos (F ou T ou FALSE ou
o o
13. 2.2 Vectores 13
TRUE)5 , n´meros inteiros ou reais, e n´meros complexos. O tamanho de um vector ´
u u e
o n´mero de elementos que ele cont´m, e pode ser obtido com a fun¸˜o length().
u e ca
Na maioria das situa¸˜es vamos criar vectores com mais do que um elemento. Para
co Criar vectores
isso precisamos de usar a fun¸˜o c() para indicar ao R os elementos que formam o vector
ca
separando-os por v´ırgulas,
> v <- c(4, 7, 23.5, 76.2, 80)
> v
[1] 4.0 7.0 23.5 76.2 80.0
> length(v)
[1] 5
> mode(v)
[1] "numeric"
Todos os elementos de um vector tˆm que ser do mesmo tipo (modo). Caso tentemos
e
criar um vector com elementos de tipo diferente o R vai for¸´-los a ser do mesmo tipo,
ca Coer¸˜o de tipos
ca
alterando-os. Vejamos um exemplo disso,
> v <- c(4, 7, 23.5, 76.2, 80, "rrt")
> v
[1] "4" "7" "23.5" "76.2" "80" "rrt"
Porque um dos elementos do vector era do tipo caracter, o R passou todos os outros
(que eram n´meros) para o tipo caracter, gerando assim um vector de conjuntos de
u
caracteres (strings). Isto quer dizer que por exemplo o primeiro elemento desse vector ´
e
a string “4” e n˜o o n´mero 4, o que tem como consequˆncia, por exemplo, n˜o podermos
a u e a
usar este elemento numa express˜o num´rica.
a e
As strings em R s˜o conjuntos de caracteres englobados por aspas ou plicas,
a
> w <- c("rrt", "ola", "isto e uma string")
> w
[1] "rrt" "ola" "isto e uma string"
Todos os vectores podem ter um elemento especial que ´ o NA. Este valor representa
e Valores
um valor desconhecido. Por exemplo, se temos os lucros trimestrais de uma empresa desconhecidos
guardados num vector, mas por alguma raz˜o desconhecemos o seu valor no terceiro
a
trimestre, poder´
ıamos usar a seguinte instru¸˜o para criar esse vector,
ca
> lucros <- c(234000, 245000, NA, 124500)
> lucros
[1] 234000 245000 NA 124500
Como j´ foi mencionado anteriormente, os elementos de um vector podem ser acedidos
a
atrav´s de um ´
e ındice. Na sua forma mais simples este ´
ındice ´ um n´mero indicando o
e u Aceder a um
elemento que pretendemos aceder. Esse n´mero ´ colocado entre parˆntesis rectos a
u e e elemento
seguir ao nome do vector,
> lucros[2]
[1] 245000
14. 14 2 FUNDAMENTOS DA LINGUAGEM R
Usando esta forma de aceder aos elementos individuais de um vector podemos alterar Alterar um elemen
o conte´do de um elemento particular de um vector,
u
> lucros[3] <- 45000
> lucros
[1] 234000 245000 45000 124500
Vectores vazios O R permite-nos criar vectores vazios usando a fun¸˜o vector(),
ca
> k <- vector()
Alterar tamanho de O tamanho de um vector j´ existente pode ser alterado atribuindo mais elementos a
a
um vector ´
ındices at´ agora inexistentes,
e
> k[3] <- 45
> k
[1] NA NA 45
Repare que os dois primeiros elementos do vector k, que anteriormente era um vector
vazio, ficaram com o valor NA ao colocarmos o valor 45 no terceiro elemento.
Para diminuirmos o tamanho de um vector podemos usar a instru¸˜o de atribui¸˜o.
ca ca
Por exemplo,
> v <- c(45, 243, 78, 343, 445, 645, 2, 44, 56, 77)
> v
[1] 45 243 78 343 445 645 2 44 56 77
> v <- c(v[5], v[7])
> v
[1] 445 2
Atrav´s do uso de formas de indexa¸˜o mais poderosas que iremos explorar na Sec-
e ca
c˜o 2.6 vamos conseguir eliminar mais facilmente elementos particulares de um vector.
¸a
2.3 Opera¸oes com Vectores
c˜
Um dos aspectos mais poderosos da linguagem R ´ a possibilidade de “vectorizar” a
e
Opera¸˜es com
co maioria das suas fun¸˜es. Isto quer dizer que a maioria das fun¸˜es dispon´
co co ıveis no R ,
vectores ao serem aplicadas a um vector, produzem como resultado um vector de resultados, que
´ obtido aplicando a fun¸˜o a cada um dos elementos do vector. Vejamos um exemplo
e ca
com a fun¸˜o sqrt() que serve para calcular ra´
ca ızes quadradas,
> v <- c(4, 7, 23.5, 76.2, 80)
> x <- sqrt(v)
> x
[1] 2.000000 2.645751 4.847680 8.729261 8.944272
Ao atribuir a x o resultado da aplica¸˜o da fun¸˜o ao vector v, estamos de facto a
ca ca
criar um vector com as ra´ ızes quadradas dos n´meros contidos em v.
u
Esta caracter´
ıstica do R pode ser usada para levar a cabo opera¸˜es aritm´ticas en-
co e
volvendo vectores,
> v1 <- c(4, 6, 87)
> v2 <- c(34, 32.4, 12)
> v1 + v2
15. 2.4 Factores 15
[1] 38.0 38.4 99.0
O que acontece se tentamos realizar opera¸˜es envolvendo vectores de tamanho dife-
co
gra da reciclagem rente? O R vai usar um regra de reciclagem dos valores do vector mais curto at´ este
e
atingir o tamanho do maior. Por exemplo,
> v1 <- c(4, 6, 8, 24)
> v2 <- c(10, 2)
> v1 + v2
[1] 14 8 18 26
´
E como se o vector c(10,2) fosse de facto c(10,2,10,2). Se os tamanhos n˜o s˜o
a a
m´ltiplos um do outro, o R imprime um aviso no ´cran,
u e
> v1 <- c(4, 6, 8, 24)
> v2 <- c(10, 2, 4)
> v1 + v2
[1] 14 8 12 34
Repare-se que um aviso n˜o ´ um erro, o que quer dizer que a opera¸˜o foi levada a
a e ca
cabo.
Como foi mencionado anteriormente, um n´mero ´ de facto armazenado em R como
u e
um vector de tamanho 1. Isto d´ bastante jeito para opera¸˜es como a seguinte,
a co
> v1 <- c(4, 6, 8, 24)
> 2 * v1
[1] 8 12 16 48
Repare que o n´mero 2 (de facto o vector c(2)!) foi reciclado at´ atingir o tamanho
u e
do vector v1, tendo como resultado a multiplica¸˜o dos elementos todos deste vector
ca
por 2. Como veremos mais tarde esta regra de reciclagem tamb´m se aplica a outros
e
objectos, como por exemplo matrizes.
2.4 Factores
Os factores proporcionam uma forma f´cil e compacta de lidar com dados categ´ricos
a o
(ou nominais). Este tipo de dados podem ser vistos como vari´veis que podem tomar
a Vari´veis nominais
a
como valores poss´ ıveis um conjunto finito de etiquetas (por exemplo uma vari´vel que
a (factores)
armazene o estado civil de uma pessoa). Os factores tˆm associados a eles um conjunto
e
de n´ıveis que s˜o os valores poss´
a ıveis que podem tomar. Como veremos mais tarde v´rias
a
fun¸˜es do R (por exemplo fun¸˜es ligadas ` visualiza¸˜o de dados) tiram partido do
co co a ca
facto de guardarmos informa¸˜o categ´rica como factores em vez de usarmos strings.
ca o
Vejamos como criar factores em R. Suponhamos que pretendemos guardar o sexo de Criar factores
10 indiv´ıduos num vector,
> s <- c("f", "m", "m", "m", "f", "m", "f", "m", "f", "f")
> s
[1] "f" "m" "m" "m" "f" "m" "f" "m" "f" "f"
Ao transformarmos um vector de caracteres num factor, o R vai dar-nos a possibilidade
de fazer coisas como por exemplo contar quantas vezes ocorre cada valor desse factor.
Podemos transformar um vector de caracteres num factor da seguinte forma,
5 Como o R ´ sens´
e ıvel `s letras mai´sculas / min´sculas, True, por exemplo, n˜o ´ um valor l´gico
a u u a e o
v´lido.
a
16. 16 2 FUNDAMENTOS DA LINGUAGEM R
> s <- factor(s)
> s
[1] f m m m f m f m f f
Levels: f m
Repare que s deixou de ser um vector de caracteres6 . Neste pequeno exemplo, o nosso
factor tem dois n´ıveis, ’f’ e ’m’.
Suponha agora que temos 4 novos indiv´ ıduos cujo sexo tamb´m pretendemos armaze-
e
nar. Imagine que por coincidˆncia todos pertencem ao sexo masculino. Se pretendemos
e
que o factor resultante mantenha os 2 n´
ıveis poss´
ıveis para o sexo de um indiv´
ıduo teremos
que fazer,
> outro.s <- factor(c("m", "m", "m", "m"), levels = c("f", "m"))
> outro.s
[1] m m m m
Levels: f m
Sem o parˆmetro extra, indicando os n´
a ıveis a usar, a fun¸˜o factor() iria dar origem
ca
a um factor com um unico n´ (’m’), uma vez que este ´ o unico valor que ocorre no
´ ıvel e ´
vector de caracteres que estamos a transformar num factor.
Conforme mencionado anteriormente, uma das vantagens de transformar um vector
de caracteres num factor, ´ a possibilidade de usar fun¸˜es espec´
e co ıficas para lidar com
Contar ocorrˆncias
e factores. Uma dessas fun¸˜es permite-nos contar o n´mero de ocorrˆncias de cada valor
co u e
(n´
ıvel),
> table(s)
s
f m
5 5
> table(outro.s)
outro.s
f m
0 4
Tabula¸˜es cruzadas
co A fun¸˜o table() tamb´m pode ser usada para fazer tabula¸˜es cruzadas de dois
ca e co
factores, desde que estes tenham o mesmo tamanho. Imaginemos que temos um outro
vector com a gama de idades dos indiv´
ıduos cujo sexo est´ armazenado em s. Podemos
a
fazer uma tabula¸˜o cruzada da idade e do sexo dos 10 indiv´
ca ıduos, da seguinte forma,
> idade <- factor(c("adulto", "adulto", "jovem", "jovem", "adulto",
+ "adulto", "adulto", "jovem", "adulto", "jovem"))
> s
[1] f m m m f m f m f f
Levels: f m
> idade
[1] adulto adulto jovem jovem adulto adulto adulto jovem adulto jovem
Levels: adulto jovem
> table(idade, s)
6 De facto, s ´ um tipo especial de vector de n´ meros, uma vez que internamente, o R guarda os factores
e u
como vectores de n´meros, com tantos valores quantos os n´
u ıveis do factor. Isto pode ser confirmado
fazendo mode(s).
17. 2.4 Factores 17
s
idade f m
adulto 4 2
jovem 1 3
Isto quer dizer que existem 4 indiv´
ıduos que s˜o adultos do sexo feminino, 2 que s˜o
a a
homens adultos, etc.
Repare como introduzimos a primeira instru¸˜o. Como era muito grande, mudamos
ca
de linha. Uma vez que o R descobre que a instru¸˜o ainda n˜o est´ terminada, apresenta
ca a a Comandos
a linha seguinte com o prompt de continua¸˜o, que ´ um sinal mais (+).
ca e espalhados por
Tamb´m ´ poss´ obter facilmente frequˆncias marginais e relativas. Por exemplo,
e e ıvel e v´rias linhas
a
para saber o n´mero total de adultos e jovens far´
u ıamos, Frequˆncias
e
marginais e relativas
> tabela.cruzada <- table(idade, s)
> margin.table(tabela.cruzada, 1)
idade
adulto jovem
6 4
Para obter a mesma informa¸˜o relativamente ao sexo dos indiv´
ca ıduos, bastaria mudar
o n´mero 1, que indica que pretendemos os totais por linha (a primeira dimens˜o do
u a
objecto) da tabela cruzada, para um 2, para obtermos os totais por coluna da tabela
cruzada,
> margin.table(tabela.cruzada, 2)
s
f m
5 5
Relativamente a frequˆncias relativas, podemos usar a fun¸˜o prop.table(), de cujo
e ca
uso apresentamos alguns exemplos,
> prop.table(tabela.cruzada, 1)
s
idade f m
adulto 0.6666667 0.3333333
jovem 0.2500000 0.7500000
> prop.table(tabela.cruzada, 2)
s
idade f m
adulto 0.8 0.4
jovem 0.2 0.6
> prop.table(tabela.cruzada)
s
idade f m
adulto 0.4 0.2
jovem 0.1 0.3
No primeiro exemplo, as propor¸˜es s˜o calculadas em rela¸˜o ao total por linha.
co a ca
Assim, o n´mero 0.6666667 ´ o resultado de dividir 4 (o n´mero de adultos femininos),
u e u
por 6 (o n´mero total de adultos). No segundo exemplo, as propor¸˜es s˜o relativamente
u co a
aos totais por coluna, enquanto que no terceiro exemplo s˜o relativas ao n´mero total
a u
de indiv´ıduos (isto ´, ficamos a saber que o n´mero de adultos masculinos representa
e u
20% do total dos indiv´ ıduos). Caso pretendˆssemos, obter os n´mero em percentagem,
e u
poder´ıamos simplesmente multiplicar as chamadas `s fun¸˜es pelo n´mero 1007 ,
a co u
7 Refira-se a t´
ıtulo de curiosidade que isto ´ mais um exemplo da regra de reciclagem.
e
18. 18 2 FUNDAMENTOS DA LINGUAGEM R
> 100 * prop.table(tabela.cruzada)
s
idade f m
adulto 40 20
jovem 10 30
2.5 Sequˆncias
e
Gerar sequˆncias de
e Podem-se gerar sequˆncias em R de v´rias formas. Por exemplo, imaginemos que pre-
e a
inteiros tendemos criar um vector com os n´mero de 1 a 1000. Em vez de os escrevermos todos,
u
podemos usar,
> x <- 1:1000
o que cria um vector com os n´mero inteiros de 1 a 1000.
u
Devemos ter algum cuidado com a precedˆncia do operador “:”, que ´ usado para
e e
gerar sequˆncias, em rela¸˜o aos operadores aritm´ticos. O exemplo seguinte ilustra os
e ca e
perigos que corremos,
> 10:15 - 1
[1] 9 10 11 12 13 14
> 10:(15 - 1)
[1] 10 11 12 13 14
Repare o que aconteceu no primeiro exemplo. Devido ao operador “:” ter maior
precedˆncia do que o “-”, o R gerou um vector com os n´meros de 10 a 15 e depois
e u
subtraiu a esse vector o n´mero 1. Devido ` regra da reciclagem isto correspondeu a
u a
subtrair 1 a todos os elementos do vector, levando ao resultado que vemos acima. J´ no
a
segundo exemplo, usamos os parˆntesis para indicar ao R que o que pretendemos ´ um
e e
vector contendo os n´meros desde 10 at´ ao resultado da opera¸˜o 15-1, i.e. 14.
u e ca
Sequˆncias
e O operador “:” tamb´m pode ser usado para gerar sequˆncias descendentes,
e e
descendentes
> 5:0
[1] 5 4 3 2 1 0
Sequˆncias de reais
e Para gerar sequˆncias com n´meros reais podemos usar a fun¸˜o seq(),
e u ca
> seq(-4, 1, 0.5)
[1] -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0
No exemplo acima geramos uma sequˆncia formada pelos n´meros a come¸ar em
e u c
-4 at´ 1 de 0.5 em 0.5. Esta fun¸˜o tem v´rias outras possibilidades para explicitar
e ca a
a sequˆncia que pretendemos. Alguns exemplos s˜o dados a baixo. Poder´ tamb´m
e a a e
explorar as potencialidades de ajuda do R, digitando o comando ? seq que mostra o
help relativamente ` fun¸˜o seq.
a ca
> seq(from = 1, to = 5, length = 4)
[1] 1.000000 2.333333 3.666667 5.000000
> seq(from = 1, to = 5, length = 2)
[1] 1 5
> seq(length = 10, from = -2, by = 0.2)
19. 2.5 Sequˆncias
e 19
[1] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2
Repare que existe uma diferen¸a subtil na forma como usamos as fun¸˜o seq() nos
c ca
exemplos acima. De facto, em vez de indicarmos os valores dos argumentos da fun-
omes dos ca
¸˜o (como por exemplo em seq(-4,1,0.5), indicamos o nome dos argumentos seguido
gumentos de um sinal igual e o valor com o qual pretendemos chamar a fun¸˜o. As duas for-
ca
mas s˜o equivalentes, no entanto a chamada por nome tem vantagens de legibilidade
a
e tamb´m quando a fun¸˜o tem muitos argumentos permite-nos desrespeitar a sua or-
e ca
dem, ou seja, relativamente aos exemplos anteriores obter´
ıamos o mesmo resultado com
seq(length=4,from=1,to=5). Iremos analisar com mais detalhe esta quest˜o quando
a
estudarmos o uso e cria¸˜o de fun¸˜es em R na Sec¸˜o 3.3.1.
ca co ca
Uma outra fun¸˜o bastante util para gerar sequˆncias ´ a fun¸˜o rep(),
ca ´ e e ca Sequˆncias repetidas
e
> rep(5, 10)
[1] 5 5 5 5 5 5 5 5 5 5
> rep("sim", 3)
[1] "sim" "sim" "sim"
> rep(1:3, 2)
[1] 1 2 3 1 2 3
A fun¸˜o gl() pode ser usada para gerar sequˆncias envolvendo factores. A sintaxe
ca e Sequˆncias com
e
desta fun¸˜o ´ gl(k,n), em que k ´ o n´mero de n´
ca e e u ıveis do factor e n o n´mero de
u factores
repeti¸˜es de cada n´
co ıvel. Vejamos dois exemplos,
> gl(3, 5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(2, 5, labels = c("nao", "sim"))
[1] nao nao nao nao nao sim sim sim sim sim
Levels: nao sim
Finalmente, o R tem uma s´rie de fun¸˜es para gerar sequˆncias aleat´rias de acordo Sequˆncias
e co e o e
com uma s´rie de fun¸˜es de distribui¸˜o de probabilidade. Essas fun¸˜es tˆm a forma ge- aleat´rias
e co ca co e o
n´rica rfunc(n, par1, par2, ...), em que n ´ o n´mero de dados a gerar, e par1, par2, ...
e e u
s˜o valores de alguns parˆmetros que a fun¸˜o espec´
a a ca ıfica a ser usada possa precisar. Por
exemplo, se pretendemos 10 n´meros gerados aleatoriamente de acordo com uma distri-
u
bui¸˜o normal de m´dia 0 e desvio padr˜o unit´rio, podemos fazer,
ca e a a
> rnorm(10)
[1] 0.6068968 1.2468432 1.8680112 1.3694861 -2.7365075 -0.8887380
[7] 0.2129164 0.8129556 -0.1786157 0.7735804
Se preferirmos 10 n´meros provenientes de uma distribui¸˜o normal com m´dia 10 e
u ca e
desvio padr˜o 3, far´
a ıamos
> rnorm(10, mean = 10, sd = 3)
[1] 11.224101 12.993983 9.577280 8.083312 7.553354 13.085718 8.347373
[8] 8.388759 11.020737 4.095438
De igual modo para obter 5 n´meros obtidos de forma aleat´ria de uma distribui¸˜o
u o ca
t de Student com 10 graus de liberdade, fazemos
20. 20 2 FUNDAMENTOS DA LINGUAGEM R
> rt(5, df = 10)
[1] 1.1357666 -2.7568824 0.7445925 -0.3963767 1.2472630
O R tem muitas mais fun¸˜es para outras distribui¸˜es de probabilidade, bem como
co co
fun¸˜es semelhantes para obter a densidade de probabilidade, as densidades acumuladas
co
e os quartis das distribui¸˜es. No entanto, a explora¸˜o exaustiva destas fun¸˜es sai
co ca co
fora do ˆmbito desta cadeira, podendo o aluno por exemplo obter mais informa¸˜o no
a ca
livro Dalgaard (2002), ou ent˜o consultando a ajuda das fun¸˜es que cont´m exemplos e
a co e
referˆncias a fun¸˜es relacionadas.
e co
2.6 Indexa¸˜o
ca
Na Sec¸˜o 2.2 j´ vimos exemplos de como extrair um elemento de um vector indicando a
ca a
sua posi¸˜o entre parˆntesis rectos. O R tamb´m nos permite usar vectores dentro desses
ca e e
Vectores de ´
ındices parˆntesis rectos. Estes vectores chamam-se vectores de ´
e ındices. Existem v´rios tipos de
a
Vector de ´
ındices vectores de ´
ındices. Os vectores de ´
ındices booleanos extraem de um vector os elementos
l´gicos
o correspondentes a posi¸˜es verdadeiras. Vejamos um exemplo concreto,
co
> x <- c(0, -3, 4, -1, 45, 90, -5)
> x
[1] 0 -3 4 -1 45 90 -5
> x > 0
[1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE
> y <- x > 0
A terceira instru¸˜o do c´digo mostrado acima ´ uma condi¸˜o l´gica envolvendo
ca o e ca o
o vector x. Esta condi¸˜o ´ uma compara¸˜o com o valor zero. Devido ` regra de
ca e ca a
reciclagem, o resultado desta compara¸˜o ´ um vector de valores l´gicos resultantes de
ca e o
fazer a compara¸˜o para cada elemento do vector x. Na instru¸˜o seguinte guardamos
ca ca
este vector l´gico no objecto y. Usando este vector como um vector de ´
o ındices, podemos
obter os elementos de x que s˜o maiores do que zero, da seguinte forma,
a
> x[y]
[1] 4 45 90
Como os elementos de y que s˜o verdadeiros (true) s˜o o 3º, 5º e o 6º, isto corres-
a a
ponde a extrair esses elementos de x, que ´ o resultado que obtemos com a instru¸˜o
e ca
mostrada acima. Poder´ ıamos obter um resultado igual, evitando criar um novo vector,
fazendo
> x[x > 0]
[1] 4 45 90
Tirando partido da gama de operadores l´gicos dispon´
o ıveis no R, podemos construir
vectores de indexa¸˜o l´gicos mais complexos,
ca o
> x[x <= -2 | x > 5]
[1] -3 45 90 -5
> x[x > 40 & x < 100]
[1] 45 90
21. 2.6 Indexa¸˜o
ca 21
peradores l´gicos
o O operador “|” corresponde ao OU (disjun¸˜o) l´gico, enquanto o operador “&” ´ o
ca o e
E (conjun¸˜o) l´gica. Isto quer dizer que a primeira instru¸˜o d´ como resultado os
ca o ca a
elementos de x que s˜o menores ou iguais a -2, ou maiores do que 5. O segundo exemplo,
a
por sua vez, mostra-nos os elementos de x que s˜o maiores do que 40 e menores do que
a
100. Note que existem duas variantes destes dois operadores l´gicos com um modo de
o
funcionamento ligeiramente diferente. Eles s˜o os operadores “||” e “&&”. Ambos fazem
a
as mesmas opera¸˜es que os anteriores, o OU e o E l´gicos. A diferen¸a reside no facto
co o c
de os operadores anteriores fazerem essas opera¸˜es de forma vectorial, ou seja elemento
co
a elemento quando os operandos contˆm mais do que um elemento, o que permite por
e
exemplo aplicar as opera¸˜es sobre conjuntos de n´meros, como nos exemplos mostrados
co u
em cima. Ou seja estes operadores produzem um conjunto de resultados (valores T ou
F). J´ as variantes com dois s´
a ımbolos, s´ fazem a opera¸˜o sobre o primeiro elemento, ou
o ca
seja procedem da esquerda para a direita, produzindo um unico resultado. Estas ultimas
´ ´
variantes s˜o essencialmente usadas em instru¸˜es de controlo da execu¸˜o de programas,
a co ca
como iremos ver na Sec¸˜o 3.2.1.
ca
O R tamb´m nos permite usar um vector de n´meros inteiros como ´
e u ındice de um Vector de ´
ındices
outro vector. Os n´meros desse vector de ´
u ındices correspondem aos elementos a extrair num´ricos
e
do outro vector,
> (v <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"))
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
> v[c(4, 6)]
[1] "d" "f"
> v[1:3]
[1] "a" "b" "c"
Podemos ainda usar um vector com n´meros negativos, o que nos permite indicar
u ´
Indices negativos
quais os elementos a n˜o obter como resultado da indexa¸˜o,
a ca
> v[-1]
[1] "b" "c" "d" "e" "f" "g" "h" "i" "j"
> v[-c(4, 6)]
[1] "a" "b" "c" "e" "g" "h" "i" "j"
> v[-(1:3)]
[1] "d" "e" "f" "g" "h" "i" "j"
Note bem a importˆncia dos parˆntesis no ultimo exemplo, devido ` precedˆncia do
a e ´ a e
operador “:” j´ mencionada na Sec¸˜o 2.5.
a ca
Um vector tamb´m pode ser indexado por um vector de strings tirando partido do
e ´
Indices com nomes
facto de o R permitir dar nomes aos elementos de um vector atrav´s na fun¸˜o names().
e ca
Vectores com os elementos com nomes s˜o por vezes prefer´
a ıveis pois as suas “posi¸˜es”
co
s˜o mais facilmente memoriz´veis. Suponhamos que t´
a a ınhamos um vector com as taxas
de infla¸˜o de 5 pa´
ca ıses europeus. Poder´ıamos criar um vector com nomes da seguinte Dar nomes a
forma, elementos de
vectores
> tx.infl <- c(2.5, 2, 2.1, 2.3, 1.9)
> names(tx.infl) <- c("Portugal", "Fran¸a", "Espanha", "It´lia",
c a
+ "Alemanha")
> tx.infl
22. 22 2 FUNDAMENTOS DA LINGUAGEM R
Portugal Fran¸a
c Espanha It´lia Alemanha
a
2.5 2.0 2.1 2.3 1.9
Os elementos do vector tx.infl podem agora ser acedidos usando os seus nomes,
> tx.infl["Portugal"]
Portugal
2.5
> tx.infl[c("Espanha", "Alemanha")]
Espanha Alemanha
2.1 1.9
´
Indices vazios Finalmente, os ´
ındices podem ser vazios, o que tem o significado que todos os elemen-
tos s˜o seleccionados. Por exemplo, se pretendemos preencher todas as posi¸˜es de um
a co
vector com zeros podemos fazer x[] <- 0. De notar, que isto ´ diferente de fazer x <-
e
0, que teria como efeito atribuir ao vector x um vector com um unico elemento (zero),
´
enquanto que a primeira alternativa, assumindo que o vector x j´ existia, iria substituir
a
todos os seus elementos por zero. Tente ambas as alternativas.
2.7 Matrizes
Por vezes poderemos estar interessados em armazenar a nossa informa¸˜o em estruturas
ca
O que ´ uma matriz
e de dados com mais do que uma dimens˜o, como ´ o caso dos vectores. As matrizes arran-
a e
jam a informa¸˜o em duas dimens˜es. Em R, as matrizes n˜o s˜o mais do que vectores
ca o a a
com uma propriedade especial que ´ a dimens˜o. Vejamos um exemplo. Suponhamos que
e a
temos doze n´meros correspondentes `s vendas trimestrais durante o ultimo ano, em trˆs
u a ´ e
Criar uma matriz lojas. As instru¸˜es seguintes permitem “organizar” esses n´meros como uma matriz,
co u
> vendas <- c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23, 78, 90)
> vendas
[1] 45 23 66 77 33 44 56 12 78 23 78 90
> dim(vendas) <- c(3, 4)
> vendas
[,1] [,2] [,3] [,4]
[1,] 45 77 56 23
[2,] 23 33 12 78
[3,] 66 44 78 90
Repare como os n´meros foram “espalhados” por uma matriz com 3 linhas e 4 colunas,
u
que foi a dimens˜o que atribu´
a ımos ao vector vendas atrav´s da fun¸˜o dim(). Na
e ca
realidade seria mais simples criar a matriz usando uma fun¸˜o espec´
ca ıfica para isso,
> vendas <- matrix(c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23, 78,
+ 90), 3, 4)
Como eventualmente ter´ reparado os n´meros foram “espalhados” pela matriz por
a u
coluna, i.e. primeiro foi preenchida a primeira coluna, depois a segunda, etc. Caso n˜o
a
seja isto o que pretendemos, poderemos preencher a matriz por linhas da seguinte forma,
> vendas <- matrix(c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23, 78,
+ 90), 3, 4, byrow = T)
> vendas
23. 2.7 Matrizes 23
[,1] [,2] [,3] [,4]
[1,] 45 23 66 77
[2,] 33 44 56 12
[3,] 78 23 78 90
Nas matrizes tamb´m ´ poss´ dar nomes aos elementos para tornar a leitura da in-
e e ıvel
forma¸˜o mais leg´
ca ıvel. Vejamos como fazer isso para a nossa matriz de vendas trimestrais
nas 3 lojas, Dar nomes `s linhas
a
e colunas
> rownames(vendas) <- c("loja1", "loja2", "loja3")
> colnames(vendas) <- c("1.trim", "2.trim", "3.trim", "4.trim")
> vendas
1.trim 2.trim 3.trim 4.trim
loja1 45 23 66 77
loja2 33 44 56 12
loja3 78 23 78 90
Como a visualiza¸˜o das matrizes sugere, podemos aceder aos elementos individuais
ca Aceder aos
das matrizes usando um esquema de indexa¸˜o semelhante ao dos vectores, mas desta
ca elementos da matriz
vez com dois ´
ındices (as dimens˜es da matriz),
o
> vendas[2, 2]
[1] 44
Ou ent˜o, tirando partido dos nomes,
a
> vendas["loja2", "2.trim"]
[1] 44
De igual modo, podemos tirar partido dos esquemas de indexa¸˜o discutidos na Sec-
ca
¸˜o 2.6 para seleccionar elementos das matrizes, como mostram os seguintes exemplos,
ca
> vendas[-2, 2]
loja1 loja3
23 23
> vendas[1, -c(2, 4)]
1.trim 3.trim
45 66
Podemos mesmo omitir uma das dimens˜es das matrizes para deste modo obter todos
o
os elementos da mesma (um ´
ındice vazio),
> vendas[1, ]
1.trim 2.trim 3.trim 4.trim
45 23 66 77
> vendas[, "4.trim"]
loja1 loja2 loja3
77 12 90
As fun¸˜es cbind() e rbind() podem ser usadas para juntar dois ou mais vectores
co
ou matrizes, por colunas ou por linhas, respectivamente. Os seguintes exemplos ilustram
o seu uso,
25. 2.7 Matrizes 25
[,1] [,2] [,3]
[1,] 12 32 4
[2,] 65 7 78
> m1 + m2
[,1] [,2] [,3]
[1,] 57 98 37
[2,] 88 84 122
A aplica¸˜o das opera¸˜es a matrizes (como no exemplo “> m*3” apresentado acima),
ca co
funciona elemento a elemento como no caso dos vectores. Isto significa que se um ope-
rando ´ menor ele ´ reciclado at´ perfazer o tamanho do maior. No entanto, o R tamb´m
e e e e
possui operadores especiais para as usuais opera¸˜es da ´lgebra matricial. Por exemplo
co a
a multiplica¸˜o de duas matrizes pode ser feita da seguinte forma,
ca Multiplica¸˜o
ca
matricial
> m1 <- matrix(c(45, 23, 66, 77, 33, 44), 2, 3)
> m1
[,1] [,2] [,3]
[1,] 45 66 33
[2,] 23 77 44
> m2 <- matrix(c(5, 3, 466, 54.5, 3.2, -34), 3, 2)
> m2
[,1] [,2]
[1,] 5 54.5
[2,] 3 3.2
[3,] 466 -34.0
> m1 %*% m2
[,1] [,2]
[1,] 15801 1541.7
[2,] 20850 3.9
Atente no operador especial (%*%) para simbolizar que se trata da multiplica¸˜o ma-
ca
tricial e n˜o a usual multiplica¸˜o. A multiplica¸˜o matricial tem, como ´ sabido, regras
a ca ca e
especiais no que concerne, por exemplo, ` dimens˜o das matrizes envolvidas, pelo que
a a
n˜o poder´ ser usada com quaisquer matrizes.
a a
Ainda no contexto da ´lgebra matricial, o R tem muitas outras fun¸˜es, como por
a co
exemplo a fun¸˜o t() para obter a transposta de uma matriz quadrada,
ca Transposta de uma
matriz
> t(m1)
[,1] [,2]
[1,] 45 23
[2,] 66 77
[3,] 33 44
ou a fun¸˜o det() para calcular o determinante de uma matriz,
ca Determinante de
uma matriz
> m <- matrix(c(34, -23, 43, 5), 2, 2)
> det(m)
[1] 1159
´
E tamb´m poss´ usar a fun¸˜o solve() para obter a inversa de uma matriz,
e ıvel ca Inversa de uma
matriz