Introdução à programação em R

3.189 visualizações

Publicada em

Introdução à Programação em R, Luís Torgo, Universidade do Porto, 2006

Publicada em: Educação
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.189
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1.925
Ações
Compartilhamentos
0
Downloads
63
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Introdução à programação em R

  1. 1. Faculdade de Economia Universidade do PortoIntrodu¸˜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
  2. 2. © L. Torgo, 2006. A licence is granted for personal study and classroom use. Redistri-bution in any other form is prohibited.© ´ L. Torgo, 2006. E concedida licen¸a de utiliza¸˜o deste documento para uso pessoal c cae para ensino. A re-distribui¸ao em qualquer outro tipo de formato ´ proibida. c˜ e
  3. 3. Conte´ do u1 Introdu¸˜o ao Ambiente ca R 7 1.1 Instala¸˜o do R . . . . ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2 Come¸ar a usar o R . c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 Ajuda sobre o R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4 “Packages” do R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Fundamentos da Linguagem R 11 2.1 Os objectos do R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3 Opera¸˜es com Vectores . . . co . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4 Factores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.5 Sequˆncias . . . . . . . . . . . e . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6 Indexa¸˜o . . . . . . . . . . . ca . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.7 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.8 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.9 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.10 Data Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.11 S´ries Temporais . . . . . . . e . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.11.1 S´ries Regulares . . . e . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.11.2 S´ries Irregulares . . . e . . . . . . . . . . . . . . . . . . . . . . . . . 363 Programa¸˜o em R ca 45 3.1 Interac¸˜o com o Utilizador . . . . . . . ca . . . . . . . . . . . . . . . . . . . 45 3.2 Estruturas de Controlo da Linguagem R . . . . . . . . . . . . . . . . . . . 46 3.2.1 Instru¸˜es Condicionais . . . . . co . . . . . . . . . . . . . . . . . . . 46 3.2.2 Instru¸˜es Iterativas . . . . . . . co . . . . . . . . . . . . . . . . . . . 48 3.2.3 Evitando ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.3 Fun¸˜es . . . . . . . . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . 52 3.3.1 Criar fun¸˜es . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . 52 3.3.2 Ambientes e “scope” de vari´veis a . . . . . . . . . . . . . . . . . . . 53 3.3.3 Argumentos de fun¸˜es . . . . . co . . . . . . . . . . . . . . . . . . . 54 3.3.4 Lazy evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.3.5 Algumas fun¸˜es uteis . . . . . . co ´ . . . . . . . . . . . . . . . . . . . 56 3.4 Objectos, Classes e M´todos . . . . . . . e . . . . . . . . . . . . . . . . . . . 58 3.5 Depura¸˜o de Programas em R . . . . . ca . . . . . . . . . . . . . . . . . . . 604 Manipula¸˜o de Dados ca 63 4.1 Carregar dados para o R . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.1.1 De ficheiros de texto . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.1.2 Da Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.1.3 Do Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.1.4 De bases de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.2 Sumariza¸˜o de dados . . . . . . . . . . . . . . . . ca . . . . . . . . . . . . . 67 4.3 F´rmulas . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . 70 4.4 Visualiza¸˜o de dados . . . . . . . . . . . . . . . . ca . . . . . . . . . . . . . 71 4.4.1 Gr´ficos Univariados . . . . . . . . . . . . . a . . . . . . . . . . . . . 73 4.4.2 Gr´ficos de 3 Vari´veis . . . . . . . . . . . . a a . . . . . . . . . . . . . 74 4.4.3 Gr´ficos Multivariados . . . . . . . . . . . . a . . . . . . . . . . . . . 78 4.4.4 Gr´ficos Condicionados . . . . . . . . . . . a . . . . . . . . . . . . . 81 4.4.5 Interac¸˜o com Gr´ficos . . . . . . . . . . . ca a . . . . . . . . . . . . . 83 4.4.6 Adicionar Informa¸˜o a Gr´ficos Existentes ca a . . . . . . . . . . . . . 84
  4. 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 . . . . . . . . . . . . 91Referˆncias e 95´Indice 97
  5. 5. Pref´cio aEste documento tem como objectivo principal fornecer uma introdu¸˜o ` programa¸˜o ca a causando 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 vezque este curso tem a an´lise de dados e o data mining como um dos assuntos centrais, ao R sendo tamb´m um ambiente de an´lise explorat´ria de dados, permite uma melhor e a oarticula¸˜o com outras disciplinas. ca A escolha do R tem ainda outros motivos relacionados com o facto de este ser umsoftware gratuito e de c´digo aberto. Estas caracter´ o ısticas, em conjunto com as suasreconhecidas 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 auma ferramenta deste g´nero como plataforma de implementa¸˜o dos conceitos apren- e cadidos, os alunos poder˜o facilmente, pelo seu car´cter gratuito, levar o que aprenderam a apara o cen´rio profissional em que se enquadram ou venham a enquadrar. Al´m disso, a eas suas caracter´ ısticas de c´digo aberto ir˜o facilitar a eventual necessidade de adaptar o aalgum dos muitos m´todos dispon´ e ıveis no R, para assim melhor os adequarem aos seusinteresses/objectivos.
  6. 6. 71 Introdu¸˜o ao Ambiente R caO R (R Development Core Team, 2006) ´ ao mesmo tempo uma linguagem de programa- e O que ´ o R? eca¸˜o e um ambiente para computa¸˜o estat´ ca ıstica e gr´ficos. Trata-se de uma linguagem de aprograma¸˜o especializada em computa¸˜o com dados. Uma das suas principais caracte- ca car´ ısticas ´ o seu car´cter gratuito e a sua disponibilidade para uma gama bastante variada e ade sistemas operativos. Neste documento iremos concentrar a nossa aten¸˜o na vers˜o ca aWindows, mas basicamente tudo o que aqui ´ descrito tamb´m se aplica `s outras vers˜es, e e a odadas 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 ecapacidades ao n´ ıvel da programa¸˜o e um conjunto bastante vasto (e em constante cacrescimento) de packages que acrescentam bastantes potencialidades ` j´ poderosa vers˜o a a abase do R. O R ´ uma variante da linguagem S com a qual John Chambers (Chambers, 1998) eganhou o prestigiado pr´mio de software da organiza¸˜o ACM. e ca1.1 Instala¸˜o do R caEmbora o R esteja instalado no sistema inform´tico da FEP, dado o seu car´cter gra- a atuito, os alunos poder˜o instalar este software nos seus computadores em casa. Para isso anecessitar˜o simplesmente de ligar o computador ` Internet e seguir os passos que des- a acrevemos em seguida. Caso n˜o pretenda realizar a instala¸˜o do R no seu computador, a capoder´ 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 aAp´s esta liga¸˜o dever´ ser feito o download do R a partir do site desta aplica¸˜o, o ca a ca Download do Rhttp://www.r-project.org. Neste site dever´ ser seguido o link com o nome CRAN ano menu dispon´ ` esquerda. Depois de escolher um dos muitos locais espalhados pelo ıvel amundo para fazer o download, dever´ seguir o link Windows (95 and later) dispon´ a ıvelna sec¸˜o Precompiled Binary Distributions. No ´cran seguinte, deve “entrar” na pasta ca ebase 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 ainstala¸˜o do R , bastando para isso executar o ficheiro (carregando duas vezes em cima ca Instala¸˜o do R cadele no Explorer). De notar que em vers˜es mais recentes do Windows esta instala¸˜o o capoder´ ter de ser feita pelo utilizador Administrador, por quest˜es de permiss˜es. a o o1.2 Come¸ar a usar o R cPara se executar o R basta usar ou o ´ıcone que normalmente est´ dispon´ no desktop a ıvel Iniciar o Rdo 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 cana 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 Rpretendemos que o R execute. Podemos come¸ar por ver um pequeno exemplo do tipo de cinterac¸˜o que vamos ter com o R, escrevendo o seguinte comando no prompt e carregando caem seguida na tecla Enter (esta ´ a forma de mandar o R executar o comando que e Executar comandosacabamos de escrever),> R.versionplatform i386-pc-mingw32arch i386os mingw32system i386, mingw32status 1 O nome do ficheiro poder´ variar em vers˜es posteriores do R. Na altura da escrita deste texto a a overs˜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.
  7. 7. 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 aTerminar 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 aContinuar o Figura 2. Se respondermos Yes a esta pergunta o R vai guardar a informa¸˜o contida na catrabalho 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 oAlterar 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 caactual 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 “/”.
  8. 8. 1.3 Ajuda sobre o R 9 Figura 2: Abandonar o R.1.3 Ajuda sobre o RO R tem um sistema de ajuda bastante elaborado que lhe permitir´ obter muita informa- aca¸˜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 cado menu Help dispon´ ıvel na janela da aplica¸˜o R. Atrav´s deste menu ´ poss´ ca e e ıvel porexemplo, escolher a op¸˜o Html help o que far´ lan¸ar um browser onde poder´ tirar ca a c apartido 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 cado 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- ama¸˜es uteis sobre a fun¸˜o escolhida, que vai da simples descri¸˜o dos seus argumentos co ´ ca caat´ exemplos de utiliza¸˜o, bem como fun¸˜es relacionadas. Em alternativa, poder´ e ca co aintroduzir antes “? sqrt”, produzindo exactamente o mesmo efeito. Quando n˜o sabemos o nome concreto da fun¸˜o sobre a qual preciamos de ajuda, a capodemos 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 ecomo argumento destas fun¸˜es. Experimente por exemplo fazer, apropos(’model’), ou cohelp.search(’model’). Para d´vidas mais complexas poder´ ainda consultar a muita documenta¸˜o gratuita u a cadispon´ ıvel no site do R (www.r-project.org), ou a mailing list de apoio dispon´ ıvel nomesmo 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 oj´ respondidas, o que nem sempre ´ bem recebido pelas pessoas que se voluntariam para a eajudar. 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 amostrar o resultado da procura da “string” que passar como argumento ` fun¸˜o. O a caresultado da procura envolve toda a ajuda de todas as fun¸˜es do R, ajuda nas mailing colists, bem como em outros documentos. Por exemplo, se pretendo saber o que existenestes locais sobre redes neuronais, poderia fazer a seguinte procura,> RSiteSearch(neural networks)1.4 “Packages” do RUma instala¸˜o do R vem j´ com um conjunto de packages instaladas. Estas packages n˜o ca a as˜o mais do que agrega¸˜es de fun¸˜es que foram criadas por algu´m que as disponibilizou a co co ea` comunidade de forma gratu´ Qualquer pessoa pode criar as suas packages e submetˆ- ıta. elas 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˜oaas fun¸˜es inclu´ co ıdas nas packages que foram julgadas mais importantes ou de uso maiscomum e que s˜o automaticamente carregadas quando se executa o R. Em qualquer aaltura poderemos “carregar” uma package que contenha fun¸˜es extra que necessitemos copara o nosso trabalho. Para tal ser poss´ ıvel a package dever´ estar instalada no nosso acomputador. Se tal n˜o fˆr o caso teremos que fazer o download da mesma e instal´-la. a o aEste processo ´ simples, desde que o seu computador esteja ligado ` Internet. e a
  9. 9. 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. caUsar 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
  10. 10. 112 Fundamentos da Linguagem R2.1 Os objectos do RO R ´ uma linguagem baseada em objectos. Isto quer dizer que tudo o que n´s vamos e ousar no R est´ guardado na mem´ria do computador sob a forma de um objecto. Todos a oos 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 deconsiste num sinal < seguido por um sinal -, como se vˆ no exemplo apresentado em se- e atribui¸˜o caguida, 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 uminado nome) basta digitar o nome do objecto no prompt do R, carregando em seguida um objectoem Enter. Como resposta o R mostra-nos o conte´do do objecto que lhe indicamos. uPor 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 usignificado “esta linha est´ a mostrar o conte´do de taxa.de.juro a come¸ar no elemento a u cnº 1 do objecto”. O significado disto tornar-se-´ mais ´bvio quando virmos objectos que a opodem armazenar mais do que um elemento, como por exemplo um vector contendo 100n´meros. u A opera¸˜o de atribui¸˜o ´ destrutiva no sentido que ao atribuir um novo valor a um ca ca eobjecto 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 ora¸˜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 eexpress˜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 aseguida ver o seu conte´do (como nos exemplos acima), podemos em alternativa usar a useguinte sintaxe que nos poupa algum tempo,> (w <- z^2)[1] 25
  11. 11. 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 eListar os objectos que n˜o precisarmos mais deles. Podemos ver quais os objectos actualmente na mem´ria a oem 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 VectoresO 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 edos 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
  12. 12. 2.2 Vectores 13TRUE)5 , n´meros inteiros ou reais, e n´meros complexos. O tamanho de um vector ´ u u eo 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 vectoresisso precisamos de usar a fun¸˜o c() para indicar ao R os elementos que formam o vector caseparando-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 ecriar um vector com elementos de tipo diferente o R vai for¸´-los a ser do mesmo tipo, ca Coer¸˜o de tipos caalterando-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 ucaracteres (strings). Isto quer dizer que por exemplo o primeiro elemento desse vector ´ ea string “4” e n˜o o n´mero 4, o que tem como consequˆncia, por exemplo, n˜o podermos a u e ausar 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 Valoresum valor desconhecido. Por exemplo, se temos os lucros trimestrais de uma empresa desconhecidosguardados num vector, mas por alguma raz˜o desconhecemos o seu valor no terceiro atrimestre, 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 aatrav´s de um ´ e ındice. Na sua forma mais simples este ´ ındice ´ um n´mero indicando o e u Aceder a umelemento que pretendemos aceder. Esse n´mero ´ colocado entre parˆntesis rectos a u e e elementoseguir ao nome do vector,> lucros[2][1] 245000
  13. 13. 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 124500Vectores 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 aum 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 eOpera¸˜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
  14. 14. 2.4 Factores 15 [1] 38.0 38.4 99.0 O que acontece se tentamos realizar opera¸˜es envolvendo vectores de tamanho dife- cogra 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
  15. 15. 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 comContar 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 4Tabula¸˜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).
  16. 16. 2.4 Factores 17 sidade 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 ahomens adultos, etc. Repare como introduzimos a primeira instru¸˜o. Como era muito grande, mudamos cade linha. Uma vez que o R descobre que a instru¸˜o ainda n˜o est´ terminada, apresenta ca a a Comandosa 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 apara 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)idadeadulto jovem 6 4 Para obter a mesma informa¸˜o relativamente ao sexo dos indiv´ ca ıduos, bastaria mudaro n´mero 1, que indica que pretendemos os totais por linha (a primeira dimens˜o do u aobjecto) da tabela cruzada, para um 2, para obtermos os totais por coluna da tabelacruzada,> margin.table(tabela.cruzada, 2)sf m5 5 Relativamente a frequˆncias relativas, podemos usar a fun¸˜o prop.table(), de cujo e causo apresentamos alguns exemplos,> prop.table(tabela.cruzada, 1) sidade f m adulto 0.6666667 0.3333333 jovem 0.2500000 0.7500000> prop.table(tabela.cruzada, 2) sidade f m adulto 0.8 0.4 jovem 0.2 0.6> prop.table(tabela.cruzada) sidade 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 caAssim, o n´mero 0.6666667 ´ o resultado de dividir 4 (o n´mero de adultos femininos), u e upor 6 (o n´mero total de adultos). No segundo exemplo, as propor¸˜es s˜o relativamente u co aaos totais por coluna, enquanto que no terceiro exemplo s˜o relativas ao n´mero total a ude indiv´ıduos (isto ´, ficamos a saber que o n´mero de adultos masculinos representa e u20% do total dos indiv´ ıduos). Caso pretendˆssemos, obter os n´mero em percentagem, e upoder´ı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
  17. 17. 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 eGerar sequˆncias de e Podem-se gerar sequˆncias em R de v´rias formas. Por exemplo, imaginemos que pre- e ainteiros 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 caSequˆncias e O operador “:” tamb´m pode ser usado para gerar sequˆncias descendentes, e edescendentes > 5:0 [1] 5 4 3 2 1 0Sequˆ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)
  18. 18. 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 seguidogumentos 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
  19. 19. 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 eVectores de ´ ındices parˆntesis rectos. Estes vectores chamam-se vectores de ´ e ındices. Existem v´rios tipos de aVector de ´ ındices vectores de ´ ındices. Os vectores de ´ ındices booleanos extraem de um vector os elementosl´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
  20. 20. 2.6 Indexa¸˜o ca 21peradores 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
  21. 21. 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 caO 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 ´ eCriar 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
  22. 22. 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 ıvelforma¸˜o mais leg´ ca ıvel. Vejamos como fazer isso para a nossa matriz de vendas trimestraisnas 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.trimloja1 45 23 66 77loja2 33 44 56 12loja3 78 23 78 90 Como a visualiza¸˜o das matrizes sugere, podemos aceder aos elementos individuais ca Aceder aosdas matrizes usando um esquema de indexa¸˜o semelhante ao dos vectores, mas desta ca elementos da matrizvez 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 oos 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 coou matrizes, por colunas ou por linhas, respectivamente. Os seguintes exemplos ilustramo seu uso,
  23. 23. 24 2 FUNDAMENTOS DA LINGUAGEM R > m1 <- matrix(c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23), 2, 5) > m1 [,1] [,2] [,3] [,4] [,5] [1,] 45 66 33 56 78 [2,] 23 77 44 12 23 > cbind(c(4, 76), m1[, 4]) [,1] [,2] [1,] 4 56 [2,] 76 12 > m2 <- matrix(rep(10, 50), 10, 5) > m2 [,1] [,2] [,3] [,4] [,5] [1,] 10 10 10 10 10 [2,] 10 10 10 10 10 [3,] 10 10 10 10 10 [4,] 10 10 10 10 10 [5,] 10 10 10 10 10 [6,] 10 10 10 10 10 [7,] 10 10 10 10 10 [8,] 10 10 10 10 10 [9,] 10 10 10 10 10 [10,] 10 10 10 10 10 > m3 <- rbind(m1[1, ], m2[5, ]) > m3 [,1] [,2] [,3] [,4] [,5] [1,] 45 66 33 56 78 [2,] 10 10 10 10 10 As regras aritm´ticas e de reciclagem que estudamos anteriormente, tamb´m se apli- e eReciclagem com cam `s matrizes. Vejamos uns pequenos exemplos, amatrizes > m <- matrix(c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23), 2, 5) > m [,1] [,2] [,3] [,4] [,5] [1,] 45 66 33 56 78 [2,] 23 77 44 12 23 > m * 3 [,1] [,2] [,3] [,4] [,5] [1,] 135 198 99 168 234 [2,] 69 231 132 36 69 > 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(12, 65, 32, 7, 4, 78), 2, 3) > m2
  24. 24. 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 cofunciona 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 epossui operadores especiais para as usuais opera¸˜es da ´lgebra matricial. Por exemplo co aa 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- catricial e n˜o a usual multiplica¸˜o. A multiplica¸˜o matricial tem, como ´ sabido, regras a ca ca eespeciais no que concerne, por exemplo, ` dimens˜o das matrizes envolvidas, pelo que a an˜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 coexemplo 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 44ou 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

×