Patrícia Ribeiro Schmidt
1 1 Instituto de Pesquisa clinica Evandro Chagas Fundação Oswaldo Cruz Programa de pós-graduação de pesquisa clínica em doenças infecciosas Computação: introdução a aplicativos de informática para auxílio à pesquisa R-project - Roteiro de aula Coordenador: Pedro Emmanuel A. A. do Brasil Coordenador: Paula Mendes Luz Leituras adicionais: Há livros com tutoriais e exemplos com R mais genéricos tais como: The R Book, R For Dummies, Data Analysis and Graphics Using R: An Example-Based Approach, Software for Data Analysis: Programming with R entre muitos outros. Há também livros de estratégias de análise de dados utilizando o R como: Clinical Trial Data Analysis Using R, Applied Meta-Analysis with R, Longitudinal Data Analysis for the Behavioral Sciences Using R etc.
2 2 ÍNDICE 1. OBJETIVOS DO MÓDULO RAZÕES PELAS QUAIS R FOI ESCOLHIDO PARA ESTE MÓDULO: O QUE É O R? INSTALAÇÃO INICIANDO ENTENDENDO O RACIONAL OPERAÇÕES ADICIONAIS COM VETORES OU OUTROS OBJETOS ACESSANDO A DOCUMENTAÇÃO DE AJUDA ATRIBUTOS PACOTES COM FUNÇÕES ADICIONAIS E CAMINHO DE PROCURA IMPORTAR DADOS DE OUTROS FORMATOS PARA O R TAREFA TIPOS DE VARIÁVEIS EXERCÍCIO EDIÇÃO DE DADOS DESCREVENDO E ESTATÍSTICAS SUMÁRIAS DE BANCOS EXERCÍCIO SALVAR RESULTADOS NO DISCO GRÁFICOS EXERCÍCIO
3 3 1. Objetivos do módulo O curso é estritamente prático e o aluno deve manipular o programa durante as oficinas. Os objetivos deste curso são: permitir que o aluno de pós-graduação em saúde, não iniciado em pilotagem de dados, seja apto a importar e editar os dados a serem utilizados na sua tese/dissertação e encontrar e entender as funções que o permitam conduzir o plano de análise de seu trabalho. Os conceitos aprendidos nesse curso permitirão ao aluno que chegar ao curso de estatística, que este possa ficar concentrado no conteúdo das aulas ao invés de como manipular o programa. Nenhuma estratégia de análise específica será abordada, tais como: testes diagnósticos, ensaios clínicos, modelos de regressão, análise de sobrevivência ou de dados longitudinais apesar de alguns exemplos serem mostrados ocasionalmente. Ao longo das oficinas, espera-se que os alunos devam tentar fazer tarefas sozinhos e à medida que conseguirem executarem algumas tarefas, possam buscar ajuda na própria documentação do R e em outros materiais didáticos mais complexos e sofisticados. Acho que para os não iniciados o sítio Quick-R é bem amigável (http://www.statmethods.net/). Junto com a apostila, no sítio há também um script para seguir os exemplos dessa apostila e alguns bancos de dados de exemplo. 2. Razões pelas quais R foi escolhido para este módulo: R é livre (www.opensource.org) R é capaz de realizar desde análises simples até análises muito sofisticadas O suporte para R é tão bom ou melhor do que softwares proprietários na lista de usuários, desde que o problema seja bem formulado. (cadastre-se antes) Multi-plataforma (Linux, Mac e Windows). Para os que estão iniciando e nunca experimentaram qualquer programa de análise, a princípio é tão difícil iniciar em R quanto em qualquer outro programa. 3. O que é o R? R é uma linguagem e ambiente para computação estatística e gráfica. O R é um sistema desenvolvido a partir da linguagem S, que tem suas origens nos laboratórios da AT&T no final dos anos Posteriormente o S foi vendido e deu origem a uma versão comercial, o S-Plus. Em 1995 dois
4 4 professores de estatística da Universidade de Auckland, na Nova Zelândia, iniciaram o Projeto R (porque R vem depois de S), com o intuito de desenvolver um programa estatístico poderoso baseado na linguagem S, e de domínio público. O R pode ser baixado gratuitamente em R é fornecido como um programa com interface de linhas de comando, que é o preferido por usuários experientes porque permite controle direto nos cálculos e é flexível. No entanto, um bom conhecimento da linguagem é necessário. Portanto, a interface de linhas de comando é intimidadora para os não iniciados. A curva de aprendizado para interface de linha de comandos é mais longa do que com interface gráfica, mas é reconhecida como um esforço recompensável e leva a melhoras práticas (melhor compreensão do plano de análise; comandos facilmente salvos e substituídos e mantém uma rastreabilidade das edições realizadas). A interface com o usuário é a maior diferença entre o R e S-PLUS e outros programas de análise. Há diversas iniciativas de interfaces gráficas para o R (http://www.sciviews.org/_rgui/), mas a maioria dos desenvolvedores dessas interfaces declara que essas são para familiarização da linguagem para o iniciante e provavelmente por isso nenhuma delas é completa (ou seja, nenhuma tem disponível todas as funções). Pessoalmente, a interface do RStudio é agradável, mas apenas porque torna a utilização da linha de comando mais agradável e amigável, não possuindo extensos menus com funções do tipo point-and-click. 4. Instalação O aplicativo pode ser encontrado no espelho mais próximo do CRAN a partir de Há orientações claras e fáceis de como instalá-lo em diversos sistemas operacionais. Para instalá-lo em computadores com Windows, basta clicar duas vezes em cima do arquivo baixado do sitio e seguir as orientações da tela. Pessoalmente, a instalação padrão é boa, mas o diretório padrão limita a instalação de extensões se o usuário não for o administrador da máquina. Assim sugiro instalar numa pasta para o R na raiz (c:\r). Para os que usam computadores multi-usuário e não são administradores da máquina (com privilégios de instalação) colar o diretório do R em qualquer pasta no computador ou num disco rígido externo também deve funcionar. Para usuários de Linux, há orientações no sitio para instalação, que são fáceis de seguir, no CRAN, sendo possível baixar os pacotes e instalá-los localmente ou adicionar o CRAN do r-project como repositório (por exemplo: e instalá-lo com o apt-get. 5. Iniciando
5 5 Se você baixou e instalou o R corretamente, quando você iniciar o programa clicando no ícone da área de trabalho, algo parecido com a imagem abaixo aparecerá! Repare que há alguns menus no topo da janela e há uma janela maior ( RGui ), e dentro desta uma menor chamada R console e um cursor piscando dentro dessa janela. Isso indica que o R está aguardando usuário escrever comandos. Se o usuário executar um gráfico, por exemplo, outra janela aparecerá dentro da janela maior. Outras janelas poderão aparecer e serem utilizadas de acordo os recursos desejados. Para executar qualquer tarefa é necessário que o usuário escreva um comando (função) no prompt. De forma alternativa, o usuário pode escrever o mesmo comando no editor de script e pedir para o R executar esse comando no prompt pelo atalho de teclado CTRL + R. A diferença é que pelo script o usuário edita e organiza as linhas de comando como lhe convêm, enquanto no console o histórico fica guardado pela ordem de execução. Pessoalmente, utilizo somente o editor de scripts. Para abrir o editor de scripts (com um novo ou já salvo script) utilize o menu Arquivo. Todas as áreas de trabalho (olhar abaixo) possuem a extensão *.RData e os scripts possuem a extensão *.R. MENUS Janela de console Prompt de comando Janela de script ou editor de script Se você quiser experimentar o RStudio (para Linux ou Windows), baixe o programa de Se você instalou o RStudio, quando você abrir o RStudio, o R deverá parecer com algo como a imagem abaixo. Mais uma vez, o RStudio é uma interface que ajuda a organizar as
6 6 janelas do R e a visualização dos seus recursos, mas não possui as funções em menus como por exemplo SPSS ou Stata. Lembrando que dentro do RStudio, para executar uma linha de comando do script o atalho é CTRL + Enter. MENUS Janela de console Histórico e área de trabalho Janela de script ou editor de script Janela de gráficos Janela de pacotes Janela de documentação 6. Entendendo o racional Muito se fala que o R é um programa orientado a objetos e os iniciantes simplesmente não entendem. Isso quer dizer que o R possui uma área de trabalho na memória do computador, e o R é capaz de armazenar qualquer objeto nessa área de trabalho, inclusive banco de dados. Dessa forma, dá pra perceber que o R pode trabalhar com vários objetos carregados simultaneamente, podendo estes ser bancos de dados, listas, vetores (sequência de valores), matrizes, tabelas etc, carregados simultaneamente, e pode carregá-los do disco ou salva-los no disco. Então qualquer modificação dos objetos na área de trabalho não modifica o que está gravado no disco até o usuário solicitar que isso seja feito. Isso não deve intimidar os iniciantes. Na verdade, não há necessidade de programar funções para execução de tarefas (apesar de ser possível dado a flexibilidade do programa), basta apenas que o usuário chame as funções para que estas executem as tarefas desejadas. Essa flexibilidade permite que o usuário possa fazer as mesmas tarefas de diversas formas diferentes. Mas, devagar...
7 7 O que é uma função? Aqui, função é sinônimo de comando. Função (usualmente aparece na documentação do R como FUN) é um conjunto de instruções que retorna um valor ou lista de valores, usualmente após uma sequência de operações ou cálculos, na forma mais simples apresenta-se com a seguinte estrutura: function(argument1,argument2,argument_n) A função (ou comando) pode possuir um ou mais argumentos, ou se possuir argumentos padrão, pode não ser necessário inserir argumentos ou opções, porque os argumentos padrões serão utilizados (por exemplo Sys.time()retorna a hora do sistema operacional). Preste atenção que tanto as funções como seus argumentos devem ser escritos exatamente como esperados, ou seja, Função é diferente de função. Então argumentos são os elementos que a função pede para executar as operações necessárias, e opções são argumentos adicionais que podem interferir na execução das operações, modificando-as para que sejam feitas de forma diferente do padrão. log(base=3,x=2187) # é a mesma coisa que [1] 7 log(2187,3) [1] 7 log(2187,10) # mudando um dos argumentos - resultado diferente [1] log(2187) # o argumento base padrão é o log natural ( ) [1] :-7 # sequencia de valores [1] abs(-4:-7)# muitas funções podem ter argumentos com diversos valores [1] sqrt(abs(-4:-7))# muitas funções podem ser aninhadas em outras [1] Repare que se os argumentos entrarem na ordem esperada, o usuário não precisa indicar o que é cada argumento, mas o usuário pode modificar a ordem como achar conveniente, desde que indique que valor se aplica aos diferentes argumentos. O sinal de # no script indica que há quebra de linha no comando, assim o R não executa qualquer coisa após desse símbolo. Ainda, reparem que o número 1 sempre aparece entre colchetes na impressão no console. Esse número indica que ordem do objeto deve ser impressa. Assim, supondo que o comando retorne 40 valores, e esses não caibam na mesma linha, quando R quebra a
8 8 linha, ele retorna o número da ordem que inicia a linha. Por último, repare que as funções no R podem ser aninhadas umas as outras, desde que uma função retorne um valor aceitável por outra. Para começar, chamemos uma função que demonstra alguns tipos de gráficos: demo(graphics) rm(list=ls()) # remove todos os objetos da área de trabalho Repare que graphics é o nome de um pacote (conjunto de funções) que R possui para gerar gráficos. Esse é um dos pacotes mantidos pelo time do core do R. Há outros pacotes gráficos disponíveis. Há centenas e centenas de pacotes no R, que não vêm instalados como padrão, pois são na vasta maioria pacotes gerados por usuários. O R pode funcionar como uma calculadora, de forma que o usuário digita as operações e a resposta retorna no console, ou o usuário pode pedir para armazenar a saída da função num objeto e depois pedir para imprimir no console, por exemplo: n <- 15 n [1] n n [1] n [1] 0 n [1] 5 x <- 1 X <- 10 x [1] 1 X [1] [1] 12 n < n [1] 12 n <- 3 + rnorm(1) n [1] pot <- 3^3
9 9 pot [1] 27 div <- pot / 2 div [1] 13.5 mult <- div * 10 mult [1] 135 sub <- mult - 4 sub [1] 131 seq <- 10:20 seq [1] seq[4] # o [] fraciona o objeto [1] 13 seq[4:7] [1] seq[c(4,7)] [1] seq[-4:-7] # o remove os elementos do objeto [1] seq - 4 [1] seq - c(4,2) # o R recicla os elementos para operações [1] Mensagens de aviso perdidas: In seq - c(4, 2) : comprimento do objeto maior não é múltiplo do comprimento do objeto menor c(-2,-9,-4,10) - c(4,6) # explicar melhor a reciclagem [1] n <- c("joão","maria","carla") # objeto alfanumerico n [1] "João" "Maria" "Carla" seq <- c('1','2','3','20') # objeto alfanumerico seq [1] "1" "2" "3" "20" sort(seq) # ordenado alfabeticamente [1] "1" "2" "20" "3" As primeiras coisas que se deve aprender desse exemplo são os operadores: <- ou - (atribuição); + (soma), - (subtração); * (multiplicação); / (divisão); == (igual),!= (diferente); (maior); < (menor); ^
10 10 (eleva a potência); : (define um intervalo). Estes são operadores fundamentais e algumas questões de precisão aritmética devem ser consideradas (?Arithmetic). O sinal de = é equivalente ao <- na maioria das situações. Do exemplo acima vemos que o operador de atribuição deposita um valor qualquer num objeto. Há operadores que funcionam para extrair partes de objetos, os [ ]. Quando o objeto tem apenas uma dimensão, funciona como o exemplo acima (haverá exemplos com mais dimensões abaixo). Então repare que para extrair o elemento na quarta posição deve-se seguir do objeto o [4], para extrair uma sequência basta inserir a sequência entre os colchetes e para extrair posições específicas não sequenciais é necessário concatenar as posições. Essa noção será muito importante para posteriormente podermos editar bancos dados. O R possui uma lógica de reutilização ou reciclagem. Repare que o vetor seq está sendo subtraído de um vetor com os valores 4 e 6. Como seq() e esse vetor possuem dimensões diferentes, o R subtrai 6 da primeira posição de seq(), 6 da segunda posição de seq() e então começa a reciclar o vetor c(4,2) até chegar na ultima posição de seq(). Repare também que o R tem como comportamento padrão substituir os objetos sem aviso de substituição. No exemplo acima o n recebeu o valor 5, posteriormente substituído por 12 sem qualquer interrupção de avisos. Ainda, os objetos devem sempre ser iniciados com letras, podendo ser seguidas de números e outros caracteres (como. ou _ ). rnorm() é uma função que gera valores de uma distribuição normal e c() é uma função de concatenação ou de condições do objeto. Ainda, repare que se um objeto possui múltiplos valores, e operações são executadas com esses objetos, as operações são executadas para cada um dos valores no objeto. Mas depois de um tempo, como eu sei quais objetos estão carregados na área de trabalho? ls() [1] "div" "mult" "n" "nomes" "pot" "seq" "sub" "x" "X ls.str() div : num 13.5 mult : num 135 n : num 3.38 nomes : chr [1:3] "João" "Maria" "Carla" pot : num 27 seq : int [1:11] sub : num 131 x : num 1 X : num 10
11 11 Repare que a função ls() lista os nomes dos objetos carregados na área de trabalho, mas não mostra o seu conteúdo, enquanto que a ls.str() mostra a classe (numérico, letras, datas etc) e uma breve descrição de seu conteúdo (dependendo do tamanho do conteúdo). Para remover um objeto da área de trabalho basta: rm(div,mult,n,pot,seq,sub,x,x) ; ls()# o ; indica que o comando terminou [1] "nomes" rm(list = ls()) # remove todos os objetos da área de trabalho ls() character(0) 7. Operações adicionais com vetores ou outros objetos Agora alguns exemplos de como manipular vetores serão demonstrados. Essa compreensão é muito importante, ou melhor, é fundamental para que o usuário consiga entender os exemplos de edição de dados mais adiante. peso <- c(62.5, 70.3, 52.1, 98.0, 90.2, 70.6) peso [1] altura <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61) altura [1] imc <- peso/altura^2 # a sequencia das operações obedecem as estipuladas imc # a operação é realizada com um elemento na mesma ordem do outro vetor [1] Repare que o R executou uma operação respeitando a ordem dos elementos, ou seja, o primeiro peso foi dividido pelo quadrado da primeira altura até o final. No entanto, uma das condições para que isso ocorra de forma razoável é que peso e altura possuem o mesmo comprimento: length(peso) [1] 6 length(altura) [1] 6 length(peso) == length(altura) # retorna um valor lógico [1] TRUE length(peso)!= length(altura) # retorna um valor lógico
12 12 [1] FALSE Já deu pra perceber nos exemplos acima que os números entre os colchetes representam índices que denotam a posição do elemento dentro do objeto. Com esses índices é possível adicionar, remover, substituir ou condicionar operações. Segue mais alguns exemplos: peso[4] <- 64 # peso na posição 4 é substituido peso [1] altura[4:5] <- c(1.84,1.94) # elementos de altura na posição 4 e 5 são substituídos # altura[4:5] <- altura[5:4] # mesma coisa altura [1] peso[8] < # adiciona mais elemento na posicao 8 # o mesmo poderia ser dito com o comando peso <- c(peso,na,94.2) peso # Foi adicionado um elemento vazio representado por NA (NOT ASSIGNED ou missing) automaticamente, porque a posição 7 não foi especificada [1] NA 94.2 is.na(peso) # Retorna TRUE onde está vazio [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE!is.na(peso) # Retorna TRUE onde NÃO está vazio [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE peso <- peso[!is.na(peso)] # remove todos os elementos que estão vazios peso [1] peso 72 # retorna TRUE onde os elementos são 72 [1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE which(peso 72) # retorna as posições em que o peso é maior que 72 [1] 5 7 peso[peso 72] # mesma coisa que peso[which(peso 72)] [1] rm(list=ls()) Repare que em um dos exemplos acima um valor ausente (missing) foi gerado, o NA. Cuidado com os valores NA, pois todas as operações com NA retornam NA e muitas funções não funcionam ou retornam erro quando há NA nos dados. Muitas possuem argumentos para ignorar os NA. Repare ainda que as condições nas edições podem ser realizadas com ou sem which(),no entanto em edições em bancos grandes a utilização dessa função é mais eficiente. Mais exemplos com essa função serão demosntrados. Os exemplos acima realizaram operações com valores lógicos (TRUE ou FALSE) e índices numéricos que indicam as posições dos elementos nos objetos. Mas também é possível adicionar nomes
13 13 aos elementos dos objetos e fazer as operações acima com os nomes dos elementos ao invés dos índices das posições (nomes são atributos de objetos e serão comentados também mais adiante): taxa <- c(2.85,3.10,10.13,11.86,8.15) names(taxa) NULL names(taxa) <- c("norte","nordeste","sudeste","sul","c.oeste") taxa Norte Nordeste Sudeste Sul C.Oeste names(taxa) [1] "Norte" "Nordeste" "Sudeste" "Sul" "C.Oeste" taxa['sul'] # aspas simples funcionam como aspas duplas quase sempre Sul taxa[c("sudeste","sul")] # não é possível usar o - p/ excluir Sudeste Sul taxa[-c("sudeste","sul")] # não é possível usar o "-" p/ excluir Erro em -c("sudeste", "Sul") : argumento inválido para operador unário taxa[!c("sudeste","sul")] # não é possível usar o "!" p/ excluir ERRO Erro em!c("sudeste", "Sul") : argumento de tipo inválido match(c("sudeste","sul"),names(taxa)) # mas é possível saber qual o índice desses nomes [1] 3 4 taxa[-match(c("sudeste","sul"),names(taxa))] # o menos exclui elementos do objeto Norte Nordeste C.Oeste pie(taxa) # os nomes são passado para o gráfico barplot(taxa) # os nomes são passado para o gráfico 8. Acessando a documentação de ajuda O R possui uma documentação com uma estrutura muito particular. Há ajuda que é instalada juntamente com os pacotes já disponíveis, há ajuda que está em pacotes não instalados, é há o suporte de outros usuários. A documentação do R está sempre em HTML, ou seja, será sempre disponibilizada através do navegador, como o firefox. Com o help.start(), toda a documentação do R, bem como uma ferramenta de procura dentro dessa documentação é disponibilizada.
14 14 No entanto, para achar uma documentação a partir do console é necessário saber exatamente o nome da função e o pacote da função precisa estar carregado. Caso contrário, é necessário explicitar que se deseja procurar termos dentro de toda documentação. Para buscar ajuda, é possível fazer de diversas formas: help.start() # Chama a documentação no navegador If nothing happens, you should open yourself?boxplot help(read.spss) # o erro aparece porque o foreign não está carregado No documentation for read.spss in specified packages and libraries: you could try??read.spss??read.spss # mesma coisa que help.search('read.spss') RSiteSearch("COX model extensions") # no sítio do R Repare que na ajuda da função boxplot, por exemplo, há uma breve descrição, em seguida a estrutura da função com os possíveis argumentos. Adiante a descrição de cada um dos argumentos, detalhes, os valores que a função retorna, referências, funções semelhantes e os exemplos. Uma doas coisas que atrapalham os iniciantes é a quantidade de funções ou maneiras que chegam a um mesmo resultado. Uma sugestão é sempre olhar os exemplos das funções e escolher a função que mais chega ao desejado. É possível chamar os exemplos (a maioria das funções possui exemplos) a partir do console para ver como a função funciona. example(boxplot) demo() # retorna todos demos disponíveis demo(plotmath) # retorna um demo desse conjunto de funções de operadores Alguns pacotes possuem uma demonstração, que usualmente são um conjunto de exemplos. A função demo retorna a execução de funções disponíveis no pacote. Ainda, é possível chamar a ajuda de funções ou pacotes por documentação extra que o autor disponibiliza em pdf ou de funções que não estão instaladas, as vinhetas. vignette(all=t) # procura por todas as vinhetas de pacotes instalados vignette("timedep") # carrega a vinheta do pacote survival
15 15 A vinheta é uma espécie de tutorial de como o autor usaria as diferentes funções no pacote. Usualmente é um documento de poucas páginas com exemplos comuns em situações comuns. Nem todos os pacotes possuem vinhetas. A quantidade de pacotes para o R já muito grande e é continuamente crescente. Assim, o time do R organiza documentação comuns para determinados tópicos no TaskViews (http://cran.rproject.org/web/views/). Assim, fica mais fácil comparar funções de pacotes diferentes que fazem coisas semelhantes ou que tem o mesmo propósito. Por último, se o usuário não conseguir resolver o seu problema com essas ajudas ou documentações, o usuário pode recorrer a lista de usuários que se ajudam mutuamente. As listas de usuários do R possui pessoas muito experientes e pessoas iniciantes. Há duas regras para o bom uso de listas de s de usuários: (1) seja educado; (2) no não mande somente perguntas como como faço para executar um boxplot?, mas seja específico, mostre que você já procurou a documentação, coloque um pedaço do script que você fez e as saídas com erros, possivelmente um pedaço dos dados ou um exemplo reproduzível para os outros usuários entenderem onde você está empacado. A lista de usuários no Brasil é necessitando cadastro antecipado. Essa lista é bastante diversificada com gente de todas as áreas. Por isso, a maioria das mensagens pode não ser interessante. Pelo mesmo motivo, é uma lista bem movimentada com dezenas de mensagens diárias. 9. Atributos Os objetos armazenados na área de trabalho também podem ser caracterizados por seus atributos, alem do nome e do seu conteúdo. Se um vetor recebe o conteúdo 1, 2 e 3 (por exemplo: c(1,2,3)), esse pode significar diferentes categorias, ou numero de vezes em que um evento ocorre. Assim, o R pode fazer operações diferenciadas dado os diferentes atributos de um objeto. Se o usuário solicitar um resumo de um objeto numérico, receberá a média, mediana etc. Caso seja um fator, a freqüência de cada categoria será impressa no console. Quatro são os modos básicos: numeric, character, complex, e logical. Para visualizar os atributos de um objeto: x <- 1 mode(x) [1] "numeric" length(x) [1] 1
16 16 A <- "Gomphotherium"; compar <- TRUE; z <- 1i mode(a); mode(compar); mode(z) [1] "character" [1] "logical" [1] "complex" class(a); class(compar); class(z) # aqui class é equivalente a mode [1] "character" [1] "logical" [1] "complex" N <- 2.1e23 N [1] 2.1e+23 x <- 5/0 x [1] Inf exp(x) [1] Inf x - x [1] NaN Repare ainda nos exemplos acima que o R trabalha de forma razoável e consistente com valores complexos infinitos ou inexistentes que podem também ser utilizados em operações. Caso o objeto seja alfanumérico ( character ), o conteúdo deve estar entre aspas. Caso contrário, o R retornará o conteúdo de um objeto. Mais uma vez, as aspas podem ser simples ou duplas, desde que quando se inicia com aspas simples deve-se terminar com aspas simples, e o mesmo ocorre com as aspas duplas. Se aspas fazem parte da expressão, essas podem ser ignoradas sendo precedidas por contra-barra. nome <- c("joão","maria","carla") a <- "nome" a [1] "nome" a <- nome a [1] "João" "Maria" "Carla" x <- "Double quotes \" delimitate R's strings." x [1] "Double quotes \" delimitate R's strings." cat(x)
17 17 Double quotes " delimitate R's strings. x <- 'Double quotes " delimitate R\'s strings.' x [1] "Double quotes \" delimitate R's strings." cat(x) Double quotes " delimitate R's strings. Há classes de objetos que são comuns tais como vector, factor, array, matrix, data.frame,ts e list. vector são objetos genéricos que armazenam números, letras, elementos complexos ou elementos lógicos. factors são objetos que armazenam números ou letras, mas esses representam classes ordenadas. array são vetores com uma, duas ou mais dimensões que podem ter atributos adicionais. Matrizes são array de duas dimensões. data.frame é o banco de dados, que pode ser composto por vetores e fatores, de diferentes modos, sempre com a mesma dimensão, e que pode ser considerado um caso especial de uma lista. ts é um banco de dados para séries temporais e por isso possuem atributos adicionais como datas e frequências. list é um objeto que pode armazenar qualquer outro objeto incluindo outras listas. Muito do raciocínio que se aplica aos bancos de dados se aplica também as listas. É interessante tentar entender as listas, pois a maioria das funções do R retorna valores dentro de listas. Há funções que permitem o usuário verificar como o objeto está armazenado como class(), mas também outras sobre classes específicas para verificar ou transformar objetos como is.factor() ou as.factor(). Isso é importante porque muitas funções genéricas do R executam operações diferentes ou retornam valores diferentes dependendo da classe do objeto. data <- as.matrix(cbind(c(1:10),c(31:40)),ncol=2) data [,1] [,2] [1,] 1 31 [2,] 2 32 [3,] 3 33 [4,] 4 34 [5,] 5 35 [6,] 6 36 [7,] 7 37 [8,] 8 38 [9,] 9 39 [10,] is.matrix(data) [1] TRUE
18 18 is.factor(data) [1] FALSE is.data.frame(data) [1] FALSE class(data) [1] "matrix" data2 <- as.data.frame(data) data2 V1 V is.matrix(data2) [1] FALSE is.factor(data2) [1] FALSE is.data.frame(data2) [1] TRUE data3 <- as.ts(data) data3 Time Series: Start = 1 End = 10 Frequency = 1 Series 1 Series is.data.frame(data) [1] FALSE
19 19 is.matrix(data) [1] TRUE class(data) [1] "matrix" plot(data2);plot(data3) rm(list=ls()) l <- list(letras=letters[1:12], Aviso="Listas permitem elementos com dimensões e atributos diferentes", M=matrix(12:1, ncol=3), F=as.formula("x~y")) l $letras [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" $Aviso [1] "Listas permitem elementos com dimensões e atributos diferentes" $M [,1] [,2] [,3] [1,] [2,] [3,] [4,] $F x ~ y names(l) [1] "letras" "Aviso" "M" "F" data <- as.list(data) names(data) NULL is.data.frame(data) [1] FALSE class(data) [1] "list" rm(list=ls()) 10. Pacotes com funções adicionais e caminho de procura R possui um caminho ordenado de procura para as coisas que estão carregadas na memória. Assim, toda vez que um pacote adicional é carregado ele fica na frente de pacotes básicos do R como o base, utils,
20 20 stats e graphics. Ainda, se um ou mais bancos de dados são anexados no caminho, o R procura sucessivamente no caminho as informações anexadas. Então para saber o que esta no caminho de procura: search() [1] ".GlobalEnv" "package:stats" "package:graphics" "package:grdevices" [5] "package:utils" "package:datasets" "package:methods" "Autoloads" [9] "package:base" Repare que até o momento somente pacotes estão carregados. Se pacotes adicionais forem carregados, eles aparecerão nessa lista. Para carregar um pacote: library(survival) # ou library('survival') Carregando pacotes exigidos: splines search() [1] ".GlobalEnv" "package:survival" "package:splines" "package:stats" [5] "package:graphics" "package:grdevices" "package:utils" "package:datasets" [9] "package:methods" "Autoloads" "package:base" Repare que agora o pacote survival está carregado e aparece em primeiro lugar na lista de procura. Ainda, quando se carrega o pacote survival, o pacote splines também é carregado, isso ocorre porque o splines é uma dependência do survival. O que significa que uma ou mais funções do survival chama uma ou mais funções do pacote splines e por isso esse precisa estar carregado para o correto funcionamento do survival. Para instalar um pacote novo utiliza-se: install.packages('rms') # install.packages() chama uma lista de pacotes no CRAN --- Please select a CRAN mirror for use in this session --- Como o espelho do CRAN não foi especificado com antecedência, o R pergunta de onde o usuário deseja baixar o pacote através de uma janela. Essa escolha valerá para todas as instalações dessa sessão do R, ou até o usuário pedir para modificar o repositório. No formato padrão, essa função instala a biblioteca no diretório padrão com todas as dependências necessárias. No entanto, cuidado ao carregar muitos pacotes, pois funções de um pacote que tenham o mesmo nome que a de outro pacote ficam mascaradas no caminho de procura. library(rms)