UNEB - Universidade do Estado da Bahia Departamento de Tecnologia e Ciências Sociais R - Introdução à Programação e Aplicações Prof. Joaquim Pereira Neto
UNEB - Universidade do Estado da BahiaDepartamento de Tecnologia e Ciências Sociais
R - Introdução à Programação e
Aplicações
Prof. Joaquim Pereira Neto
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Juazeiro - Bahia
2
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
R - Introdução à Programação e Aplicações
1. Introdução ao R
O R é um sistema desenvolvido a partir da linguagem S (que também é usada numa
versão comercial – o S-Plus), que teve suas origens nos laboratórios da AT&T no
final dos anos 80. Em 1995 dois professores de da Universidade de Auckland, na
Nova Zelândia, iniciaram o “Projeto R”, com o objetivo de desenvolver um programa
poderoso baseado na linguagem S e de domínio público.
Atualmente o R está disponível para a família UNIX (incluindo LINUX), Windows 95,
98, NT, 2000, Me, XP.
O R está encontra-se na internet no website do CRAN – que é o Comprehensive R
Archive Network ou “Rede Completa de Arquivos do R”, no seguinte endereço:
http://www.r-project.org.
2. Instalando e inicializando o R para windows
Para instalar o R não tem grandes dificuldades. Basta dar um duplo-clique no ícone
do programa de instalação e seguir as instruções que aparecem na tela. Ao fazer isso,
o programa será instalado no diretório padrão (geralmente “c:\Programa Files\R\
rwXXXX\”) e será criada uma pasta dentro do seu menu Iniciar – Programas,
chamada “R”. Adicionalmente, um ícone será colocado na sua área de trabalho.
Para iniciar o programa, dê um duplo clique no ícone do R localizado na área de
trabalho.
Ao fazer isso, o programa será executado e uma janela, com o programa será aberta.
Observe que ele tem uma barra de menus, uma de ícones e prompt de linha de
comando.
3. Comandos e operações com o R
1
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Comandos R são expressões inseridas no prompt ">". Quando um valor é digitado
e finalizado pela tecla enter , é executado um comando.
Inicialmente vamos mostrar o R como calculadora. Por exemplo, tente fazer uma
adição simples:
> 3 + 5[1] 8
Linhas que apresentam o símbolo # , definem um comentário e são ignoradas pelo R .
Principais funções
Vamos agora apresentar as principais funções disponibilizadas pelo R . No R todas as
funções têm a forma:
>função(argumento(s)obrigatórios,argumento(s)opcional(is))
Sendo que os argumentos opcionais podem ter um valor padrão pré-estabelecido ou
não. Os argumentos estarão sempre entre parênteses sendo separados por vírgula.
> sqrt(2) # Encontra a raiz quadrada de 2
[1] 1.414214
> sin(pi/6) # Encontra o seno de 30º
[1] 0.5
Se você deixar o primeiro argumento em branco, vai receber uma mensagem de erro:
> log( ,3)
Error in log(,3):Argument "x" is missing, with no default.
A seguir, apresentamos uma lista das principais funções e operadores aritméticos:
Função Descrição Operadores Descrição
sqrt( ) raiz quadrada + adição
abs( ) valor absoluto - subtração
exp( ) exponencial de base “e” * multiplicação
log10( ) logaritmo na base 10 / divisão
log( ) logaritmo na base “e” ** ou ^ potência
sin()cos() tan() funções trigonométricas
asin( ) acos( ) funções trigonométricas
2
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
atan( ) inversas
Exemplos> log(8,2) # calcula o logaritmo de 8 na base 2
[1] 3
> log10(2) # calcula o logaritmo de 2 na base 10
[1] 0.30103
> log(2) # calcula o logaritmo de 2 na base "e"
[1] 0.6931472
Para pedir ajuda ao R, por exemplo, para a raiz quadrada, digite uma das opções:
> help(sqrt)
> ?sqrt
4. Como o R armazena objetos e comandos
Antes de prosseguirmos com mais aplicações do R, vamos mostrar a maneira diferente
como ele guarda as informações.
O R é uma linguagem orientada a objetos. Um objeto para o R significa tanto um
banco de dados, como uma tabela, variáveis, vetores, matrizes, funções, etc,
armazenados na memória ativa do computador.
Para criar um objeto qualquer no R, você deverá sempre usar o operador de
atribuição “<-“ , gerado pela digitação do sinal de menor e menos.
> x<-sqrt(9)
Usuários pronunciam o comando dizendo: o objeto recebe um certo valor. Por
exemplo, x<-sqrt(9), leia-se, "x recebe a raiz quadrada de 9".
O objeto x , armazenou a raiz quadrada de 9. Verifique, digitando x:
> x
[1] 3
3
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Alternativamente, podemos empregar os símbolos “->” ou “=”. As linhas a seguir,
produzem o mesmo resultado:
> sqrt(9)->x
> x=sqrt(9)
Como esperado, você pode fazer operações com objetos:
> x=sqrt(9)
> x<-sqrt(9)
> y<-log10(100)
> x+y
[1] 5
Observe que ao atribuir um valor a um objeto, o programa não imprime nada na tela.
Digitando uma operação matemática, sem atribuir o resultado a um objeto, isto faz
com que o programa imprima o resultado na tela.
Nomes de objetos (tabelas, variáveis, etc.) devem começar sempre com uma letra e, podem conter letras, números e pontos. Maiúsculas e minúsculas são consideradas diferentes.
> x1<-log(exp(1))
> x1
[1] 1
Por exemplo, a forma a seguir, não é válida:
> 2a<-log(exp(1)) # não iniciar com um número
5. Workspace
Ao contrário de outros programas que você já deve conhecer (como Excel, Word, etc),
o R não armazena cada um dos seus objetos como um arquivo que fica em uma
determinada localização no seu disco rígido.
Quando você usa um editor de texto como o Word, por exemplo, e salva o seu
trabalho pela primeira vez, o programa pede para você dar um nome ao seu arquivo e
4
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
salvar o arquivo fisicamente em um diretório (que em geral é em “Meus Documentos”
– “My Documents” se versão em inglês).
Uma vez salvo, o arquivo estará naquele local com o nome que você deu e, portanto,
você poderá abri-lo no Word para futura edição ou para imprimir, etc.
O R trabalha um pouco diferente. A coleção de objetos criados durante uma sessão R
é denominada de workspace. Ao final de uma sessão R , todos os objetos criados
serão salvos permanentemente em um arquivo denominado .RData, no diretório de
trabalho do R , quando o usuário responde, "yes", à pergunta, "Save
workspace image?" .
A vantagem do R salvar todos os arquivos em um único, é que você pode armazenar
todos os objetos relativos a um determinado projeto num diretório próprio do projeto.
Exemplo
Crie uma pasta na raiz do diretório do drive C. Primeiro vamos fazer com que o R
mude o diretório de trabalho que, em geral é configurado par ser , C:\Arquivo de
programas\R\rwxxxx\.RData.
Faça assim:
Na barra de menus do R, clique em “File” e em seguida em “Change dir”
Uma pequena janela chamada “Change directory” se abrirá. Clique em
“Browse”
A janela “Browse” se abrirá. Procure no C:, a pasta o que vai ser o seu
diretório de trabalho.
Clique em “OK” e em “OK” novamente na outra janela.
Agora, o nosso diretório de trabalho é o "C:\pasta" , e todos os objetos serão
salvos neste diretório.
Digite o comando > quit( ) e , em “Save Workspace”, clic
“Sim”.
Note que o arquivo “.RData” e “Rhistory”, estão salvos no nosso
diretório de trabalho.
5
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Uma outra característica do R é a capacidade de armazenar um histórico de
comandos usados anteriormente. Como no caso dos objetos, o R armazena esses
comandos num arquivo que tem a extensão “.Rhistory”, também sem nome por default
(e que também pode ser modificado, mantendo-se a extensão). Esse arquivo é na
verdade um ASCII que contém todos os comandos que você salvou na sua última
sessão. É claro que você pode editar esse arquivo, salvar com um nome diferente, etc.
Observação
Como os comandos ficam acumulados, para você recuperar comandos, basta usar as
teclas de setas de deslocamento vertical, para recuperá-los.
6. Eliminando e guardando objetos
Já sabemos que as entidades criadas e manuseadas pelo R designam-se por objetos.
Durante uma sessão de R, os objetos são criados e guardados por nomes. Os
comandos,
> objects()
> ls()
listam os objetos guardados pelo R. Para eliminar objetos usa-se o comando rm().
Por exemplo, para eliminar os objetos x e y , digite:
> rm(x,y)
elimina todos os objetos listados dentro do parêntese.
7. Tipos de objetos
Existem sete tipos básicos de objetos no R que podem ser classificados em duas
categorias:
Objetos atômicos – são objetos que contém apenas dados de um único tipo:
Vetores, matrizes, Arrays, Fatores, Séries temporais.
Objetos não atômicos – são objetos que cotem valores de todos os tipos:
Data Frame Objects, List data objects.
Os objetos podem ainda ser classificados de acordo com o Mode, Attributes e Class.
6
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Mode -refere-se à natureza dos seus elementos, por exemplo, logical, numeric,
complex e character.
Attributes – informa sobre a estrutura e conteúdo do objeto, isto é, descreve o
objeto, como: tipo (data.frame), colunas, linhas, colunas, dimension (dimensão de
uma matriz), etc.
Class – dá uma classificação geral para o objeto, por exemplo, (matrizes, fatores,
data.frame, listas).
Os elementos de um objeto pode ser um dos seguintes modos:
logical = Modo binário, com valores representados as T ou F (True ou False)
numeric = Números reais (0.25)
complex = Números complexos, a + bi (2 + 3i)
character = Caracteres representados como strings ("Maria")
As funcões associadas são:
mode(objeto) = retorna o modo de um objeto
length(objeto) = retorna o comprimento de um objeto
attributes(objeto) = retorna a todos os outros atributos de um objeto
data.class(objeto) = retorna o tipo de objeto
A seguir, veremos com mais detalhe cada um dos tipos de objetos e como criá-los na
linguagem R .
7.1 Vetores
A forma mais simples de armazenamento de dados é o um objeto, no R um vetor. Um
vetor é um conjunto de números ou de caracteres, ou de valores lógicos, de um mesmo
tipo de dados.
Como os dados são mais freqüentemente são números, os vetores numéricos são os
mais usuais.
Os vetores apresentam dois atributos:length e mode.
Experimente os comandos listados para se familiarizar com estas estruturas.
7
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> n<-3 # colocamos o número 3 no objeto n
> n
[1] 3
> b<-"banana" # colocamos o nome banana no objeto b
> b
[1] "banana"
> mode(b)
[1] "character"
Para criar um vetor com o nome x , constituído por cinco números, por exemplo, 10.5,
5.6, 3.1, 6.4, 21.7, usa-se o comando:
> x<-c(10.4, 5.6, 3.1, 6.4, 21.7)
> x
[1] 10.4 5.6 3.1 6.4 21.7
> length(x)
[1] 5
> mode(x)
[1] "numeric"
Os vetores podem ser criados por outras funções, tais como:Função Descrição Examplos
scan lê valores (qualquer tipo) scan(), scan("meuarq")
c combina valores (qualquer tipo) c(1,3,2,6), c("sim", nao")
rep repeate valores (qualquer tipo) rep(c(1,2), 3)
: seqüencias numéricas 1:5 1:-1
seq seqüencias numéricas seq(-pi, pi, .5)
Função scan()
> x<-scan()
1: 10.4 5.6 3.1 6.4 21.7
6:
Read 5 items
> x
8
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
[1] 2 4 6 8 10
> frutas<-scan(what=" ", sep=",")
1: banana,uva,manga
4:
Read 3 items
> frutas
[1] "banana" "uva" "manga"
Observação
Se uma expressão é usada sem uma designação, o seu valor é calculado, visualizado na
tela, mas perde-se. Assim, considere os comandos:
> x<-c(2, 4, 6, 8, 10)
> 1/x
[1] 0.5000000 0.2500000 0.1666667 0.1250000 0.1000000
Simplesmente, calcula os inversos dos cinco números (armazenados no vetor x),
imprime o resultado na tela, perdendo-se os valores de 1/x, mas, o valor do vetor x,
obviamente, não é alterado.
Função rep()
> x<-rep('a',5)
> x
[1] "a" "a" "a" "a" "a"
> x<-rep(2,6)
> x
[1] 2 2 2 2 2 2
> x<-rep(c('s','n'), c(2,4))
9
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> x
[1] "s" "s" "n" "n" "n" "n"
> x<-rep(c(4, 5, 6), 2)
> x
[1] 4 5 6 4 5 6
Função seq()
> x<-seq(-1,1,0.4)
> x
[1] -1.0 -0.6 -0.2 0.2 0.6 1.0
> x<-seq(-1,1,length=6)
> x
[1] -1.0 -0.6 -0.2 0.2 0.6 1.0
> x<-seq(-1, by=0.4, length=6)
> x
[1] -1.0 -0.6 -0.2 0.2 0.6 1.0
"gl()", gera série regulares de níveis de fatores
> a<-gl(2,3)
> a
[1] 1 1 1 2 2 2
Levels: 1 2
> b<-gl(2,2, label=c("m","f"))
> b
[1] m m f f
Levels: m f
"expand.grid() combina dados dos vetores (Produto cartesiano)
> c<-expand.grid(a,b)
10
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> c
Var1 Var2
1 1 m
2 1 m
3 1 m
4 2 m
5 2 m
6 2 m
7 1 m
8 1 m
9 1 m
10 2 m
11 2 m
12 2 m
13 1 f
14 1 f
15 1 f
16 2 f
17 2 f
18 2 f
19 1 f
Geração de sucessões ou seqüências numéricas.
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
O operador “:” (dois pontos) tem prioridade máxima numa expressão onde seja
usado; por exemplo,
> 2*1:10
[1] 2 4 6 8 10 12 14 16 18 20
Função scan(), associada à função names:
> notas<-scan()
1: 9.5 9.0 8.2 7.3 5.5
6:
11
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Read 5 items
> alunos<-scan(what=" ", sep=",");
1: Adriane, Pedro, Joana, Mario, Cintia
6:
Read 5 items
> names(notas)<-alunos
> notas
Adriane Pedro Joana Mario Cintia
9.5 9.0 8.2 7.3 5.5
Observe que podemos dar nomes aos elementos de um vetor, através da associação
desse vetor, a um outro vetor de mesmo comprimento, empregando a função names.
7.2 Concatenação de vetores
Vetores podem ser concatenados para gerar outros vetores. Por exemplo, considere
os vetores x e y dados a seguir:
> x <- c(2, 3, 5, 2, 7, 1) # Junção seqüencial
> y <- c(10, 15, 12)
> z <- c(x,y)
> z
[1] 2 3 5 2 7 1 10 15 12
7.3 Operações aritméticas com vetores
Podemos realizar operações aritméticas com vetores, elemento a elemento, caso estes
tenham a mesma dimensão.
Considere os vetores relativos ao peso e altura de um grupo de 6 pessoas.
> peso<-c(62, 70, 52, 98, 90, 70)
> altura<-c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61)
Vamos calcular o índice de massa corporal (i.m.c) para essas pessoas?
.
12
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> i.m.c<-peso/altura^2
> i.m.c
[1] 21.45329 21.13271 16.97959 26.03890 26.58318 27.00513
Também estão disponíveis as funções, min e max, para a obtenção dos valores
máximo e mínimo de vetores.
> max(peso)
[1] 98
> min(peso)
[1] 52
A função range dá como resultado um vetor de comprimento 2, com os elementos
mínimo e máximo de um vetor x .
> range(peso)
[1] 52 98
De outra forma:
> c(max(peso),min(peso))
[1] 98 52
Duas funções estatísticas a média e variância são definidas, respectivamente, por:
, .
Dado o vetor x = (1 , 2 , 3 , 6), pelo R , temos:
> x<-c(1, 2, 3)
> mean(x)
[1] 2
> var(x)
[1] 1
De outra forma:
> sum(x)/length(x)
13
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
[1] 2
> sum((x-mean(x))^2)/(length(x)-1)
[1] 1
7.4 Vetores lógicos
Tal como vetores numéricos, o R manipula igualmente vetores lógicos. Os elementos
de um vetor lógico são um dos valores possíveis, False (falso) e True
(verdadeiro). Estes valores são geralmente abreviados para F e T,
respectivamente. A seguir, apresentamos uma lista dos operadores comparativos e lógicos:
Operador comparativo
Descrição Operador lógico Descrição
< menor que & (vetor) e x&y> maior que && (para avaliar
condições)e x&&y
<= menor ou igual
| (vetor) ou x|y
>= maior ou igual
|| (para avaliar condições) ou x&&y
== igual xor (exclusivo) ou xor(x , y)!= diferente ! não negação
Exemplos
> x<-seq(-2, 2, by=0.5)
> x
[1] -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0
> x>=-1
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> x<=1
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Um vetor lógico para -1 ≤ x ≤ 1 é expresso por:
14
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> x>=-1 & x<=1
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Um vetor lógico para x -1 ou x 1 é expresso por:
> x<=-1 | x>=1
[1] TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
7.5 Valores missing
Em alguns casos pode acontecer não se conhecerem todos os elementos de um vetor.
Quando um elemento ou valor não está disponível, ou está em falta (missing value, no
sentido estatístico) o valor atribuído é NA (Not Available). De um modo geral,
qualquer operação envolvendo um valor NA origina um outro valor NA.
A função is.na(x) origina um vetor lógico com a dimensão de x , com o valor
TRUE(verdadeiro), se e somente se o correspondente elemento de x é NA, e
FALSE(falso), caso contrário.
> x<-c(1:3, NA)
> x
[1] 1 2 3 NA
> z<-is.na(x)
> z
[1] FALSE FALSE FALSE TRUE
Observe que o vetor x é formado por 3 valores não nulos e um valor missing; o
vetor z tem os 3 primeiros valores FALSE e o quarto TRUE.
Temos ainda, um segundo tipo de valor missing, aqueles que são originados por
cálculos indeterminados, designados por valores NaN(Not a Number). Alguns
exemplos de valores NaN são produzidos por expressões indeterminadas do tipo:
> 0/0 # Indeterminação
[1] NaN
> Inf – Inf # Indeterminação
[1] NaN
15
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
7.6 Vetores alfanuméricos
Valores alfanuméricos e vetores de caracteres são usados freqüentemente em R, como
por exemplo, os rótulos (“labels”) dos gráficos. Quando são necessários, os
valores alfanuméricos são definidos como cadeias de caracteres delimitadas por
apóstrofos ou aspas duplas, por exemplo, “valores de x”.
A função past() toma como entrada um número variável de argumentos e adiciona-
os um a um seqüencialmente numa cadeia de caracteres. Os argumentos no vetor
resultante são separados por espaços em branco, mas este caracter de separação
pode ser definido, usando o parâmetro sep = “separador”, em que a expressão
“separador” define o tipo de separador a ser usado.
Exemplos
> x<-paste(c("X"), 1:10)
> x
[1] "X 1" "X 2" "X 3" "X 4" "X 5" "X 6" "X 7"
[8] "X 8" "X 9" "X 10"
> x<-paste(c("X"), 1:10, sep="-")
> x
[1] "X-1" "X-2" "X-3" "X-4" "X-5" "X-6" "X-7"
[8] "X-8" "X-9" "X-10"
> xy<-paste(c("X","Y"), 1:10, sep="-")
> xy
[1] "X-1" "Y-2" "X-3" "Y-4" "X-5" "Y-6" "X-7"
[8] "Y-8" "X-9" "Y-10"
Observe que no último exemplo, o vetor c(“X”, “Y”), com
dois valores, é repetido cinco vezes até perfazer o
comprimento da seqüência 1:10 .
7.7 Vetores indexados e extração de subvetores
16
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Subconjuntos de elementos de um vetor podem ser selecionados, dando origem a um
vetor de índices, definidos através de colchetes.
Tais vetores podem pertencer a uma das quatro categorias:
Vetor de inteiros positivos
Neste caso, os valores do vetor índice devem pertencer ao conjunto {1, 2, 3, . . . ,
length(x)}. Os elementos correspondentes do vetor são selecionados e concatenados, nesta
ordem, no vetor resultante.
> x<-c(0, 8, 9, 7, 4, 2, 10, 0, 2, 1)
> x1<-x[6]
> x1
[1] 2
define o vetor x1 é formado pelo 6º elemento do vetor x.
> x2<-x[2:6]
> x2
[1] 8 9 7 4 2
... o vetor x2 formado pelos elementos de índices 2 até 6.
> x3<-x[c(2, 4, 8)]
> x3
[1] 8 7 0
define o vetor x3, formado pelos elementos de índices 2, 4
e 8.
Vetor de valores inteiros negativos
Um vetor de índices negativos especifica que os elementos que apresentam estes índices
devem ser excluídos, e não selecionados.
> x6<-x[c(-1, -2, -10)]
> x6
[1] 9 7 4 2 10 0 2
define o vetor x6, formado pelos elementos de x, excluídos
os elementos de índices 1, 2 e 10.
Vetor alfanumérico
17
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Esta opção só pode ser empregada a um objeto com o atributo names, definido para
identificar seus componentes. Neste caso, um sub-vetor do vetor de nomes pode ser usado do
mesmo modo que o vetor de valores inteiros definido anteriormente.
> frutas<-c(5, 10, 1, 20)
> frutas
[1] 5 10 1 20
> names(frutas)<-c("laranja", "banana", "maçã", "pera")
> jantar<-frutas[c("maçã", "laranja")]
> jantar
maçã laranja
1 5
O vetor jantar contém os valores 1 e 5.
Vetor definido por uma sentença lógica
Neste caso, o vetor de índices deve conter uma sentença lógica, associada aos
elementos do vetor do qual vamos selecionar os elementos. Os elementos
correspondentes a T=TRUE são selecionados e os que correspondem a F=FALSE
serão omitidos.
Exemplos> x<-c(0, 8, 9, 7, 4, 2, 10, 0, 2, 1)
> xa<-x[x > 4]
> xa
[1] 8 9 7 10
Define o vetor xa, formado pelos elementos de x maiores que 4.
> xb<-x[x > 2 & x <= 8]
> xb
[1] 8 7 4
Define o vetor xb, formado pelos elementos de x maiores que 2 e
menor ou igual a 8.
8. Entrada de dados
Existem várias formas de dar entrada nos dados para que o R possa transformá-los
em um objeto a ser manipulado por este software.
18
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Podemos dar entrada nos dados diretamente pelo teclado, ou através da leitura de
arquivos externos.
O R é capaz de ler arquivos externos de dados em diversos formatos diferentes,
como ASCII (arquivio texto, delimitado por espaço, tabulação, vírgula, entre outros),
Excel, SSPS, SAS e outros.
8.1 Editor Script Windows
O R dispõe de um editor de texto que pode ser empregado para escrever os dados ou
programas. Para iniciar este editor , click no menu File e New script,
para criar um novo arquivo. Para abrir um arquivo já existente, click sobre Open
script... .
No caso em que empregamos o editor para escrever um programa, podemos executá-
lo através do comando Run all, do menu Edit do Editor do R.
8.2 Entrada de dados através das linhas de comandos
A função data.frame() pode ser empregada para dar entrada nos dados
diretamente através das linhas de comando.
Um data.frame (folha de dados) é uma estrutura na forma de uma tabela,
na qual as colunas representam variáveis numéricas (como idade), variáveis
categóricas (como sexo), variáveis caracteres (como nome do indivíduo), sendo que as
linhas são as observações.
Os atributos de um data.frame são length, mode, names, rownames e
class.
length – dá o número de componentes
mode – é a lista
names – dá os nomes das variáveis
row.names – dá os nomes ou numeração das linhas
class – mostra o tipo de objeto que estamos trabalhando.
19
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Programa 01. – Saída
nomes sexo idade altura
1 Adriano m 17 1.65
2 Pedro m 18 1.70
3 Joana f 19 1.68
4 Mario m 20 1.69
5 Cintia f 21 1.71
6 Maria f 22 1.67
7 Antonio m 23 1.67
8 Marta f 24 1.66
9 José m 25 1.72
10 João m 26 1.73
Comentários no programa.
8.3 Matrizes
Uma matriz é uma disposição bidimensional dos dados em linhas e colunas, onde as
colunas são as variáveis e as linhas as observações. Os elementos de uma matriz
devem ser numéricos.
Matrizes apresentam quatro atributos:length – dá o número de elementos da matriz
mode – dá o tipo de valores
dim – dá o número de linhas e colunas
dimnames – dá os nomes das linhas e colunas
Criando matrizes usando a função “matrix”
A função matrix tem a seguinte estrutura:
matrix(data, nrow=m, ncol=n, byrow=T ou F).
Podemos usar a função matrix para converter um vetor em uma matriz, especificando
o número de linhas (ou colunas) e se o preenchimento da matriz deve ser feito por
colunas (deflaut) ou por linhas.
20
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Por exemplo, suponha que você tenha as notas de cinco alunos em três provas em uma
determinada disciplina. Aqui, as linhas representam os alunos e as colunas
representam as notas das provas, mostradas na tabela a seguir:
p1 p2 p3
7.5 6.9 8.2
8.1 7.3 6.7
5.9 6.8 9.0
7.8 7.0 7.5
8.8 7.9 6.4
Assim como nos vetores, uma matriz pode ser criada digitando-se seus valores
diretamente no R, através da função scan() sem os argumentos.
Programa 02.
# Entrada da matriz diretamente pelo comando scan()
notas.matrix<-matrix(scan(), ncol=3, byrow=T)
7.5 6.9 8.2 8.1 7.3 6.7 5.9 6.8
9.0 7.8 7.0 7.5 8.8 7.9 6.4
> notas.matrix
[,1] [,2] [,3]
[1,] 7.5 6.9 8.2
[2,] 8.1 7.3 6.7
[3,] 5.9 6.8 9.0
[4,] 7.8 7.0 7.5
[5,] 8.8 7.9 6.4
Observe que o preenchimento da matriz foi feito por linhas, ou seja, byrow=T.
Assim como nos vetores, uma matriz pode ser criada usando-se a função c() para
combinar os valores:
# Empregando o comando c()
notas.matrix<-matrix(c(7.5,6.9,8.2,8.1,7.3,6.7,5.9,6.8,
9.0,7.8,7.0,7.5,8.8,7.9,6.4), ncol=3, byrow=T)
Criando matrizes usando a função “rbind” e “cbind”
21
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Uma matriz também pode ser construída pela combinação de dois ou mais vetores de
mesmo comprimento (length). Do exemplo anterior, usando a função cbind()
e rbind(), a matriz, notas.matrix, pode ser definida por:
Programa 03.
# Definindo os vetores das notas e usando cbind
notas.p1<-c(7.5, 8.1, 5.9, 7.8, 8.8)
notas.p2<-c(6.9, 7.3, 6.8, 7.0, 7.9)
notas.p3<-c(8.2, 6.7, 9.0, 7.5, 6.4)
notas.matrix<-cbind(notas.p1, notas.p2, notas.p3)
# Listando a matriz
notas.matrix
notas.p1 notas.p2 notas.p3
[1,] 7.5 6.9 8.2
[2,] 8.1 7.3 6.7
[3,] 5.9 6.8 9.0
[4,] 7.8 7.0 7.5
[5,] 8.8 7.9 6.4
Usando a função rbind() para combinar os vetores como
linhas da matriz.
# Definindo os vetores das notas, usando rbind
aluno1<-c(7.5, 6.9, 8.2)
aluno2<-c(8.1, 7.3, 6.7)
aluno3<-c(5.9, 6.8, 9.0)
aluno4<-c(7.8, 7.0, 7.5)
aluno5<-c(8.8, 7.9, 6.4)
notas.matrix<-rbind(aluno1,aluno2,aluno3,aluno4,aluno5)
# Listando a matriz
notas.matrix
[,1] [,2] [,3]
aluno1 7.5 6.9 8.2
22
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
aluno2 8.1 7.3 6.7
aluno3 5.9 6.8 9.0
aluno4 7.8 7.0 7.5
aluno5 8.8 7.9 6.4
Criando matrizes usando a função “dim”
Podemos criar uma matriz de um vetor já existente, que pode ser não numérico,
empregando a função dim.
# Matrizes não-numéricas, empregando a função "dim"
meses.matrix<-c('Jan','Fev','Mar','Abr','Mai','Jun',
'Jul','Ago','Set','Out','Nov','Dez')
dim(meses.matrix)<-c(6,2)
meses.matrix
[,1] [,2]
[1,] "Jan" "Jul"
[2,] "Fev" "Ago"
[3,] "Mar" "Set"
[4,] "Abr" "Out"
[5,] "Mai" "Nov"
[6,] "Jun" "Dez"
Observe que a função dim, faz a leitura dos dados por coluna que é o default.
Ou de outra forma, empregando o comando matrix:
# Empregando o comando matrix com ncol
matrix(meses.matrix,ncol=2)
# Empregando o comando matrix com nrow
matrix(meses.matrix,nrow=6)
Atribuindo nomes às linhas e colunas de uma matriz
Podemos atribuir nomes às linhas e colunas de uma matriz. Para tanto, considere o
programa a seguir:
Programa 04. – Saída
23
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Prova.1 Prova.2 Prova.3
Adriano 7.5 6.9 8.2
Pedro 8.1 7.3 6.7
Joana 5.9 6.8 9.0
Mario 7.8 7.0 7.5
Cintia 8.8 7.9 6.4
Álgebra matricial
Apresentaremos as operações mais usadas entre as matrizes, as mais complexas será
objetivo de estudos mais avançados.
Programa 05.
Neste programa você encontrará aplicações das principais
operações da álgebra matricial.
8.4 Listas
Uma lista em R é um objeto constituído por uma coleção ordenada de objetos,
conhecidos como, os suas componentes.
Uma lista é o tipo de objeto mais flexível do R, pois os componentes de uma lista
podem ser de qualquer modo ou tipo, incluindo outras listas. Você pode combinar, por
exemplo, um vetor numérico com 10 valores e uma matriz de ordem 4 x 4.
A lista é a mis freqüente escolha para retornar valores de uma análise do R, devido a
sua flexibilidade. Por exemplo, a saída do ajuste de uma regressão linear retorna em
uma lista de valores numéricos, como por exemplo, os coeficientes e resíduos que têm
comprimentos diferentes, dentre outros resultados. Listas podem ser criadas
empregando-se a função list.
Exemplo
Vamos construir uma lista com os dados de uma família: nome do pai, da mãe,
número de filhos e idade dos filhos.
Programa 06.
24
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
# Trabalhando com Listas
# Criando uma Lista
dados<-list(pai="Jose", esposa="Maria", n.filhos=3,
idade.filhos=c(4, 7, 9))
# Apresentando a Lista
dados
Os elementos de uma lista são usualmente extraídos pelo nome, usando-se "nome_
da_lista$componente", ou o número de posição do componente na lista,
lst[[número_de posição]], como operador.
Verifique quando rodar o programa, a distinção entre as notações lst[número],
lst[[numero]] e lst[[número]][número]
Construção e / ou modificação
A função list, pode criar listas a partir de objetos já existentes, através do comando:
> lista <- list(nome_1=objeto, . . . , nome_n=objeto)
Isto é o que denominamos concatenação de listas(objetos).
Ver progrma 06.As listas, tal como todos os objetos indexados, podem ser ampliados, especificando-se componentes
adicionais, através do comando:
> lst[[5]]<- list(nova componente)
Este comando adiciona a lista "lst" a "nova componente".
8.5 Fator
Um fator é vetor que se usa para representar dados categóricos, através de um vetor
assumindo os valores 1,2,...,k, denominados níveis.
Por exemplo, você pode criar a variável sexo como um fator(m,f) , do exemplo
já dado, anteriormente, através da função factor.
Programa 07.Parte do programa mostrando a listagem dos níveis.
25
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> # Lista a variável sexo do objeto alunos
> alunos$sexo
[1] m m f m f f m f m m
Levels: f m
8.6 Entrada de dados via arquivos externos
A função mais simples que lê os dados de um arquivo externo no R, faz parte do
pacote básico e se chama read.table(). Essa função importa dados em formato
ASCII para um objeto do tipo data.frame (tabela).
Suponha que você tenha um arquivo texto, como o descrito a seguir, chamado
dados01.txt que encontra-se na sua pasta de trabalho.
nomes sexo idade salario
Adriano m 17 300.00
Pedro m 18 335.00
Joana f 19 415.00
Mario m 20 470.00
Cintia f 21 550.00
Maria f 22 620.00
Antonio m 23 690.00
Marta f 24 750.00
José m 25 832.00
João m 26 975.00
Para ler essa tabela como um data.frame e criar um novo objeto func.tab,
considere o programa dado a seguir.
Programa 08.
> func.tab<-read.table("dados1.txt", header=T)
26
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
O argumento header=T, indica que a primeira linha de dados contém o nome das
variáveis (colunas). Se não for o caso, não forneça o argumento header, pois
seu default é FALSE (F).
A ausência de nomes para as colunas (variáveis) e linhas (observações), faz com que
o R assuma por deflaut os valores, V1, V2, . . . , Vn , para as linhas e 1, 2, . . . , para
as linhas.
Se o arquivo externo não apresenta a primeira linha com o
nome das variáveis (header=T), temos:
> func.tab<-read.table("dados1.txt", col.names="nomes"
"sexo","idade","salario")
Observações
Ao sair do programa R, devemos salvar o objeto "func.tab", para que este
fique disponível no workspace “.Rdata”.
O R ativa automaticamente todos os arquivos guardados no seu “.RData”, ao
ser inicializado.
Para ativar um caminho de busca de um data.frame, use o comando attach(), para
o exemplo, temos:
> attach(func.tab)
Para desativar um caminho de um data.frame, use o comando detach(), para o
exemplo, temos:
> detach(func.tab)
Para corrigir algo na digitação, armazenado em um data.frame, você tem que
abrir a planilha e, para tal digite:
fix(nome do objeto), no nosso exemplo:
> fix(func.tab)
8.7 Entrada de dados através da planilha R
27
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
A função edit abre uma planilha para a digitação de dados a serem
armazenados como data.frames.
Considerando o mesmo exemplo, dado anteriormente, para abrir uma nova planilha
em branco, digite:
> func.tab<-edit(data.frame())
Antes de começar a introduzir os dados, deve-se definir o tipo de cada variável
(caracter ou numérica) (coluna), clicando no nome var1, var2,...,varN, na
coluna correspondente a cada variável. Após definir todas as variáveis, comece a
digitação dos dados. Para que a tabela de dados esteja disponível na próxima sessão
do R, ao enceramos o programa, devemos salvar o workspace.
9. Transformação de variáveis
Esta é uma operação que ocorre freqüentemente em muitas aplicações, na
Matemática e Estatística, tal como, análise de variância e regressão.
Para tratarmos deste assunto, considere o exemplo retirado do livro de Vieira, S.;
Hoffamann R., Estatística Experimental.
Um agrônomo quer verificar se a percentagem de germinação sementes depende do
pH do solo. Para isso, colocou solo com pH 4,6 em seis vasos e solo com pH 6,4 em
outros seis vasos. A percentagem de germinação de sementes em cada vaso, conforme
o pH é dado a seguir. Transforme os dados: arcsen( ).
Percentagem de germinação conforme o pH do solo
pH 4,6 pH 6,4
0,96 0,95
0,91 0,98
0,90 0,98
0,93 0,97
0,96 0,95
0,92 0,99
Adicionando colunas (variáveis) ao data frame
28
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
A transformação de variáveis pode ser feita adicionando-se uma coluna com a
variável transformada, de duas formas:
Adição de colunas
Nome_objeto$nova_variável<- expressão_de_transformação
Programa 09.
# Transforma a variável pH4.6
pH$pH1t <- asin(sqrt(pH$pH1))
Empregando a função tranform
> pH<-transform(pH, pH1t=asin(sqrt(pH1)),
pH2t=asin(sqrt(pH2)))
> pH
10. Combinando data frame
Podemos combinar vários data.frames para gerar um único data.frame,
que contém todas as informações dos demais. Considerando as formas de combinação
temos os seguintes casos:
a) Combinando data frame por colunas
Este é o caso, que ocorre, quando você tem um data.frame com novas variáveis e
que adicionar a um data.frame já existente ou, tem dois ou mais data
frames com observações de diferentes variáveis com o mesmo número de
observações. A principal ferramenta neste caso é a função cbind.
Suponha que temos duas tabelas(tab01) e tab(02), com diferentes
variáveis (colunas), conforme mostra o programa a seguir.
Programa 10.> tab01
nomes sexo
1 Adriano m
> tab02
idade altura
1 17 1.65
29
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
2 Pedro m
3 Joana f
4 Mario m
5 Cintia f
6 Maria f
7 Antonio m
8 Marta f
9 José m
10 João m
2 18 1.70
3 19 1.68
4 20 1.69
5 21 1.71
6 22 1.67
7 23 1.67
8 24 1.66
9 25 1.72
10 26 1.73
Aplicando a função cbind, temos:
# Junata as tabelas (tab01 e tab02) juntando as variáveis
(colunas)
tab.col<- cbind(tab01,tab02)
tab.col
b) Combinando data frame por linhas, com as mesmas variáveis nas tabelas
Neste tipo de combinação, as tabelas apresentam as mesmas variáveis, sendo que
cada tabela, apresenta um determinado número de observações. Neste caso, emprega-
se a função rbind, sendo que o número de observações na nova tabela resultante,
será igual a soma do número de observações das tabelas envolvida na operação.
Programa 11.Combinando quatro tabelas por linhas
> G1
nomes salario classif.
1 Adriano 300 A
2 Pedro 335 A
> G2
nomes salario classif.
30
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
3 Joana 415 B
4 Mario 470 B
5 Cintia 550 B
> G3
nomes salario classif.
6 Maria 620 C
7 Antonio 690 C
8 Marta 750 C
> G4
nomes salario classif.
9 José 832 D
10 João 975 D
Veja o resultado, executando o programa.
c) Combinando data frame por linhas, com algumas variáveis em comum nas tabelas
Neste tipo de combinação, as tabelas apresentam algumas variáveis em comum.
Neste caso, emprega-se a função rbind,sendo que o número variáveis será definida
pelas variáveis comuns e, o número de observações na nova tabela resultante, será
igual a soma do número de observações das tabelas envolvida na operação.
Programa 12.Combinando quatro tabelas por linhas
> tab01
nomes idade
1 Adriano 17
2 Pedro 18
3 Joana 19
4 Mario 20
5 Cintia 21
31
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> tab02
nomes idade altura
1 Maria 22 1.67
2 Antonio 23 1.67
3 Marta 24 1.66
4 José 25 1.72
5 João 26 1.73
Veja o resultado, executando o programa.
d) A função merge
Merge é um processo que combina duas ou mais tabelas que apresentam
variáveis (colunas) e observações em comum. Neste caso você podemos
usar a função merge. Por exemplo, considere as tabelas mostradas a seguir.
Programa 13.
> tab01
nomes X1 X2 X3
1 Walter 4 0.308 10
2 João 3 0.235 11
3 Sérgio 5 0.207 4
4 Rui NA 0.270 10
5 Adão 7 0.283 5
> tab02
nomes X1 X4 X5
1 Sérgio 5 300 0.974
2 João 3 7 0.990
3 Walter 4 9 0.980
4 Rui NA 55 0.963
5 Adão 7 532 0.955
32
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Observe que estas tabelas têm em comum as duas primeiras colunas (variáveis),
podemos então juntar as duas tabelas através da função merge.
> tab01.tab02
nomes X1 X2 X3 X4 X5
1 Adão 7 0.283 5 532 0.955
2 João 3 0.235 11 7 0.990
3 Rui NA 0.270 10 55 0.963
4 Sérgio 5 0.207 4 300 0.974
5 Walter 4 0.308 10 9 0.980
Mais explicações e exemplos você pode encontra na ajuda:
> help("merge")
11. Listando variáveis de um banco de dados ( data frame)
Um data.frame é equivalente a um banco de dados, que você provavelmente já
conhece, ou seja, trata-se de uma tabela onde as colunas são as variáveis e as linhas
são os registros. Vamos agora dar início à exploração do nosso pequeno banco de
dados já criado, func.tab.
Programa 14.
Listando todo o banco de dados (tabela)
> names(func.tab)
Listando as variáveis e colunas: nomes e salário
> func.tab[c("nomes","salario")]
> func.tab[c("nomes","salario")]
Pesquisando no objeto nova.tab salários menores ou igual a 400
> nova.tab[func.tab$salario<=400, c("nomes","salario")]
Pesquisando no objeto nova.tab salários maiores 400 e menores que 700
33
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> nova.tab[func.tab$salario > 400 & func.tab$salario
< 700,c("nomes","salario")]
ObservaçãoVeja como eliminar variáveis neste programa e outras aplicações.
12. Introdução à programação
Antes de iniciarmos programação na linguagem R, vamos falar um pouco sobre
programação estruturada. A idéia básica da programação estruturada consiste em
construir programas cada vez mais claros e legíveis, de modo que seja possível fazer
uma boa documentação do mesmo. Por outro lado, a eficiência e o tamanho do
programa também não devem ser desprezados. Por isso, é necessário que os
programas usem estruturas padronizadas ou básicas que facilitem o entendimento por
parte de qualquer pessoa, sem perda da eficiência na sua execução.
Foi mostrado, pelos pesquisadores em Ciência da Computação, que é possível
escrever qualquer programa usando somente combinações das três estruturas
básicas: seqüencial, condicional e repetitiva.
A programação estruturada, não é somente uma maior estruturação de programas
através da clareza no uso de comandos e modularização de trechos de programas,
como muitos programadores habilidosos julgam já estar fazendo. A programação
estruturada consiste em impor uma disciplina rígida de uso das estruturas básicas no
programa o que certamente faz com que os programas sejam melhorados ainda mais
quanto à clareza e eficiência. Um programa não significa apenas a introdução de
comandos e definições corretas em um computador – na verdade essa é apenas a
parte mais simples. Um programa necessita um planejamento cuidadoso e testes
rigorosos a posteriori.
12.1 Sobre a linguagem R
O R é uma linguagem orientada a objeto, isto significa que as variáveis, dados,
resultados, etc., ficam armazenados na memória ativa do computador em forma de
objetos, com um nome específico, este fato a torna mais simples e flexível. Por outro
34
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
lado, também é uma linguagem interpretada, ou seja, comandos são lidos e
executados imediatamente pelo computador, o que não ocorre com as linguagens
compiladas, tais como C e Pascal nas quais, os programas são traduzidos por um
compilador em uma linguagem de máquina apropriada e, posteriormente, executadas.
A grande vantagem das linguagens interpretadas é que elas permitem o
desenvolvimento de programas através de incrementos, isto é, você escreve uma
função executa esta função, escreve uma segunda função também a executa e, escreve
uma terceira função que chama as duas anteriores. Esta característica é uma grande
importância para as linguagens interpretadas, pois permite desenvolver programas
de forma mais eficiente. Por outro lado as linguagens compiladas por serem
traduzidas para código de máquina, gastam menos tempo de execução, como também
ocupam menos memória que as linguagens interpretadas.
12.2 Tomando decisões dentro de um programa R
As estruturas de controle de uma linguagem permitem especificar quais comandos ou
operações serão executadas e em qual ordem, ou seja, elas determinam o fluxo de
execução em um programa.
Blocos
Comandos podem ser agrupados empregando-se {comando . . . comando},
denominados de um bloco. Comandos simples são avaliados quando uma nova
linha é encontrada, até atingir a última linha do grupo.
Um bloco só é avaliado quando a execução atingir a última linha do bloco.
Programa 15.
# Emprego de um bloco de comandos {. . . }
# 1. Entre com os números: 2, 3, 4, 5
# 2. Encontrar um novo vetor "x + 2"
{
x <- c(1, 2, 3, 4, 5)
35
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
x + 2
}
12.3 Controle de fluxo
Num livro intitulado “Diagramas de Fluxo de Máquinas e Linguagens com Apenas
Duas Regras de Formação”, C. Böhm e G. Jacopini mostram que qualquer algoritmo
pode ser codificado, utilizando-se somente três estruturas de controle: seqüencial,
condicional e repetitiva.
Lembrando que um algoritmo é a descrição de um conjunto de comandos que,
obedecidos, resultam numa sucessão finita de ações.
12.4 Estrutura seqüencial
A estrutura seqüencial é aquela em que os comandos em um programa são executados
um após o outro na ordem em que aparecem, sendo tão natural que raramente
pensamos sobre ela. Na ausência de uma especificação contrária, a próxima instrução
da lista deve ser executada, isto é, os comandos são executados linha a linha de
programação sem nenhum desvio.
Programa 16.Encontrar a média dos números: 1, 2, 3, 4, 5, empregando a
estrutura seqüencial.# Encontrar a média dos números:1,2,3,4,5, empregando a
estrutura seqüencial
# 1. Entre com os números: 1, 2, 3, 4, 5
x <- c(1, 2, 3, 4, 5)
# 2. Encontre a soma
soma <- sum(x)
# 3. Lista o resultado da soma
soma
# 4. Calcula o comprimento do vetor
n <- length(x)
# 5. Lista o valor de n
36
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
n
# 6. Encontra a média
media<-soma/n
# Lista a média
cat("*** A média de x é:", media , "\n")
# Empregando a função média
m <- mean(x)
m
12.5 Looping
Você pode querer fazer uma série de tarefas dentro de um bloco de comandos, ou até
mesmo fora dele. As tarefas iterativas (loops) podem ser feitas através dos
comandos, for, while e repeat. Os loops são geralmente empregados nos
programas, coma s seguintes funções:
a) Para repetir a mesma transformação (ou computação) sobre os elementos de um
vetor ou matriz.
b) Para formar somas, tais como, àquelas associadas a variância amostral, ou
expansão de séries de potências.
c) Para implementar métodos iterativos
O loop for
O mais importante loop construtor na linguagem R é o for. O comando
for permite que uma tarefa seja repetida á medida que uma variável assume valores
em uma seqüência específica.
Sintaxe:for(i in 1:n) {faça alguma coisa }Programa 17.
# Dado os números de 1 a 10 imprimir esta seqüência
for(i in 1:10)
{
print(i)
37
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
}
Execute o Programa 17., para ver mais aplicações com o comando
"for".
O loop while
O comando while permite que uma ação seja repetida até que uma
condição seja verdadeira. No mometo que a a condição deixar de ser
verdadeira, isto é, pasar a ser falsa, a ação não mais se realiza.
Sintaxe:while(condição...)
{ação...
}
Programa 18.
# Dado os números de 1 a 10 imprimir esta seqüência
x=1
while(x<=10)
{
print(x)
x = x + 1
}
Execute o Programa 18., para ver mais aplicações do comando
"while".
O loop repeat
Não existe muita diferença entre o comando repeat e o comando while,
exceto que a condição para terminar o comando break, é testada dentro do
looping.
Sintaxe:repeat
{
expressão
38
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
}
expressão = uma expressão matemática.
O comando repeat permite que uma expressão seja repetida
indefinidamente, loopinpg infinito , a não ser que a condição do
comando break seja satisfeita. Um comando break é da forma,
repeat
{
expressão) if(condição) break
}
Programa 19.# Imprimir a seqüência dos números de 1 a 10
x = 1
repeat
{
print(x)
x <- x + 1
if(x > 10) break
}
Execute o Programa 19., para ver mais aplicações do comando
"repeat" e "break".
12.6 Estrutura condicional
Uma execução condicional implica que uma instrução ou grupo de instruções tem sua
execução condicionada a um teste (verificação da veracidade). O if geralmente é
utilizado para denotar uma execução condicional, sendo seguido de uma expressão
lógica. Uma expressão deste tipo poderá assumir um dos valores lógicos, verdadeiro
ou falso. Se for verdadeira, as instruções subordinadas ao if são executadas, caso
contrário ignoradas.
if
39
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
O comando condicional if tem a seguinte sintaxe:
Sintaxe:If (condição1){tarefa a ser realizada se condição1=TRUE}.
Programa 20.
# Dado o número x , encontrar o módulo de x , |x|
x1 <- 2
if (x1 >= 0) x = x1
x
x1 <- -3
if (x1 < 0) x = -x1
xExecute o Programa 20., para ver mais aplicações.
if else
A estrutura de decisão if else, disponível no R tem a seguinte sintaxe.
if (condição) expressão-1 else expressão-2
Se a condição é verdadeira executa a expressão-1, caso contrário
executa a expressão-2.
Os auxiliares break e next
break: este comando é empregado para terminar qualquer ciclo (loop),
for, while ou repeat. Esta é a única forma de quebrar um ciclo repeat,
a não ser que ocorra um erro.
next: o comando next é empregado quando se quer deixar de executar um
ciclo e passar a execução seguinte.
Programa 21.
# Avalia dois número "a" e "b"
a <- 25
a
b <- 50
40
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
b
if(a > b) c = a else c = b
cExecute o Programa 21., para ver mais aplicações.
ifelse
O comando ifelse é uma versão vetorizada do comando if
else.
Sintaxe:ifelse(condição, expressão-1, expressão-2)
Este comando avalia as expressões 1 e 2 e retorna ao valor apropriado
para cada uma, baseada na condição.
Programa 22.# Dado um vetor x encontrar o módulo dos elementos de x
x <- -2:5
# Versão vetorizada do if else
y <- ifelse(x >=0, x, -x)
y
Execute o Programa 22., para ver mais aplicações.
13. Escrevendo funções no R
Uma das maiores potencialidades do R é aquela que permite ao usuário definir suas
próprias funções. Isso o torna uma ferramenta poderosa para testar novas
metodologias e realizar simulações.
A nova função R que você construir poderá ser completamente nova (um novo modelo
que você está testando, por exemplo) ou apenas uma modificação personalizada de
uma função R existente. Você pode desejar ainda usar as funções já existentes de
modo repetido no seu conjunto de dados, isto facilitará em muito o seu trabalho, já
que as tarefas a serem realizadas ficarão incorporadas em uma única função.
Sintaxe:
41
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
nome <- function (argumentos) {
seqüências de expressões R (corpo)
return(argumento)
}
nome:
aquele que você escolhe para dar a função;
argumentos:
lista de expressões a serem usadas dentro da função;
corpo:
é a parte da função que realmente trabalha, é constituído por expressões R que
serão avaliadas sequencialmente quando executadas;
return:
é o último valor calculado, mas você pode usar a o comando return().
13.1 Variáveis globais e locais
Variáveis definidas no ambiente onde a função foi chamada, são denominadas de
globais e visíveis pela função.
Variáveis definidas no interior de uma função são denominadas de locais a essa
função.
Programa 23.# Dado os catetos de um triângulo retãngulo, encontrar a
hipotenusa:
hipot. <- function (b,c) {
options(digits=5)
sqrt(b^2 + c^2)
}
cat("*** Entre com os catetos b e c na forma:
hipot.(b,c) pressione ENTER\n")
Execute o Programa 23., para ver mais aplicações.
42
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Observações
a. Os objetos criados dentro do corpo da função são locais àquela função, ou seja, só
existem na memória do computador apenas durante a execução da função.
b. Voce pode colocar comentários no corpo da função usando o símbolo # antes do
comentário.
c. A função irá retornar apenas um objeto, que pode ser um vetor, uma matriz ou uma
lista, etc. O nome do objeto a ser referenciado deve aparecer (sozinho) na última
linha antes do "}" final. Se nenhum nome aparecer no final do corpo da função,
será retornado o valor da última expressão avaliada no corpo da função.
Veja as observações na execução do Programa 23.
13.2 Cálculo com funções
Dada uma função definida por uma lei de formação f(x) , construir uma tabela com
os valores de x e f(x).
Dada uma função f(x) definida por várias sentenças, construir uma tabela com os
valores de x , para cada intervalo de definição da função f(x).
Seja f(x) definida por:
Programa 23.# Grafico de uma função definida por várias sentenças
# Definindo a função
f <- function(x) {
fx <- numeric(length(x))
fx[x <= 0] <- (-x)[x <= 0]
fx[x > 0 & x <=2] <- (x^2)[x > 0 & x <= 2]
fx[x > 2]<- (2*x)[x > 2]
f<-data.frame(x,fx)
43
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
f
}
cat("***Entre com os valores de x no vetor: > x<-c(x1,
x2,...), ENTER, depois
com f(x) e ENTER\n")
Execute o Programa 23., para ver mais aplicações.
14. Métodos iterativos
Em um grande número de problemas, a solução pode ser encontrada aplicando-se o
mesmo cálculo repetidamente, cada vez, fazendo-se uso de um valor como solução
inicial, chegando após sucessivos cálculos a melhor solução aproximada. Este
processo matemático forma uma seqüência convergente, se a solução converge para
um valor, tal que, o erro torna-se cada vez menor a cada repetição. Tal método é
denominado de iterativo.
O método iterativo de Newton-Raphson
Em alguns casos existem fórmulas simples para o cálculo de raízes de funções, tais
como, linear e quadrática, em outros, como nas funções polinomiais cúbicas, existem
fórmulas que têm muito pouco valor prático e, na maioria dos casos, nem mesmo
existem fórmulas, empregando-se, portanto, métodos aproximados para encontrá-las.
O método de Newton-Raphson é baseado na simples idéia geométrica associada às
tangentes sucessivas ao gráfico de uma dada função. As tangentes interceptam o eixo
dos x em pontos que estão cada vez mais próximos da raiz da função (figura a
seguir).
f(x)
f(x1)
0 x4 x3 x2 x1 x
44
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Vamos supor que estamos encontrar a raiz r da equação f(x) = 0. Do gráfico, vamos
considerar x1 como a nossa primeira aproximação da raiz r ; podemos melhorar
de forma geral a aproximação, movendo a tangente à curva, por sucessivos valores de
x , obtendo assim, valores cada vez mais próximos de r . Este procedimento para
aproximar r , é denominado método de Newton-Raphson. O método pode ser
implementado analiticamente como mostrado a seguir.
Seja x1 a nossa primeira aproximação, que é normalmente (chutada), logo, podemos
escrever,
.
Se considerarmos x2 como a aproximação seguinte, x3 , . . . , temos:
.
O processo iterativo termina se a diferença | xn+1 - xn | for suficientemente pequena.
Exemplo
Considere a função definida por, f(x) = x3 – 3x + 1 . Encontrando a derivada de f(x),
f ´(x) = 3x2 - 3 , fica: .
Calculando os valores sucessivos de f(x), a partir de x1 = 0 , com incremento
de 0,1 , verificamos que existe uma raiz no intervalo (0.333 x 0.444),
pois:
f(0.333) = 0.03703704 e f(0.4444444)=-0.24554184,
ocorrendo mudança de sinal da função f(x).
Programa 24. (saída) x fx
1 0.0000000 1.00000000
2 0.1111111 0.66803841
3 0.2222222 0.34430727
4 0.3333333 0.03703704
45
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
5 0.4444444 -0.24554184
6 0.5555556 -0.49519890
7 0.6666667 -0.70370370
8 0.7777778 -0.86282579
9 0.8888889 -0.96433471
10 1.0000000 -1.00000000
Observações
Quando funciona, o método de Newton-Raphson, as aproximações convergem para a
solução com grande velocidade.
O método falha quando f´(x)= 0 para algum n, pois, envolve a divisão por zero,
tornando impossível gerar xn + 1.
O método também pode falhar por outras razões; ele pode ignorar as raízes que você está
tentando encontrar e convergir para uma outra raiz e, às vezes, pode não convergir.
15. Aplicações à Matemática
Devido a sua grande versatilidade o R pode ser empregado na área da matemática;
no estudo de funções, na construção de gráficos, no cálculo matricial, no cálculo
diferencial e integral, dentre muitas outras aplicações.
Derivada e integral
O cálculo diferencial e integral constitui um dos pilares das ciências modernas,
entretanto, às vezes é de difícil aplicação, tornando os programas computacionais,
ferramentas quase que indispensáveis no trabalho científico. Neste sentido, o R nos
fornece funções pré-existente, ou que podem ser criadas, para um tratamento
rigoroso do cálculo.
Calculo de derivadas de funções
O calculo de derivadas de funções na forma algébrica é realizado através do seguinte
comando:D(expresssion(fun),"var")
fun - função a ser derivada;
var - variável em relação a qual vamos derivar a função.
46
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Programa 25.# Encontrar a derivada das funções: f(x) = x + x2 + x3 e
f(x,y) = x + yx2 + x3
# em relação à variável x.
D(expression(x + x^2 + x^3), "x")
Execute o Programa 25., para ver mais aplicações.
Integral definida de funções de uma variável
Para encontrar a integral definida de uma função f(x) de uma variável real, em um
intervalo finito ou infinito, emprega-se o comando a seguir:
integrate(f(x),limite inferior, limite superior, . . . )
onde:Programa 25.
# Encontra a integral definida da função, f(x) = x^2, no
intervalo [0 , 1]
integrate(function(x) x^2,0,1)
Integral e probabilidade
Em funções associadas às probabilidades, para variáveis aleatórias contínuas, a
integral definida está associada ao cálculo da probabilidade em um intervalo.
Seja f(x) uma f. d. p (função de densidade de probabilidade) de uma variável
aleatória contínua, então:
P(a < x < b) = .
Por exemplo, se X uma v.a. (variável aleatória) com distribuição N(4 , 9) =
Normal(média , variância), então, f(x) é dada por:
= , = 4 e = 3 .
Calcular a probabilidade P(5 < x < 7).Programa 25.
# Probabilidade:f.d.p. normal com média=4 e desvio padrão = 3
47
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
fx<-function(x) {(1/(3*sqrt(2*pi)))*exp(-(1/2)*((x-4)/3)^2)}
#Calculando a integral com integrate
integrate(fx,5,7)
Execute o Programa 25., para ver mais aplicações.
16. Gráficos com R
As capacidades gráficas são um componente muito importante e extremamente
versátil do ambiente R. É possível utilizar estas possibilidades para criar uma grande
variedade de gráficos, como também, definir novos tipos de gráficos. Para termos
uma idéia destas opções, digite o comando, demo(graphics).
Após um comando gráfico, o R abre uma janela gráfica para visualizar os
gráficos.
O R apresenta três tipos de funções gráficas:
Funções gráficas de alto nível, que cria novos gráficos na janela gráfica.
Funções gráficas de baixo nível, que permite adicionar novas informações a
gráficos já criados, tal como novos dados, linhas e etiquetas.
Funções gráficas iterativas, que permitem adicionar ou remover
interativamente, informações aos gráficos, empregando um dispositivo
apontador, como por exemplo o mouse.
16.1 Gráfico de dispersão
Uma das funções gráficas mais usada no R é a função plot(), que é uma
função genérica, sendo que o tipo de gráfico que é criado, depende do tipo ou da
classe do primeiro argumento dado a função.
Sintaxe:plot(x, y,...)
Plotando um vetor – Para plotar os elementos de um vetor numérico x , ou
seja, os x[i] versus i.
> plot(x)
48
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Programa 26.
# Gárfico de dispersão dos elementos do vetor: salário
attach(func.tab)
plot(salario)
Gráfico de dispersão dos elementos do vetor: salário
2 4 6 8 10
300
500
700
900
Index
sala
rio
Plotando dois vetores – Para plotar o vetor y na vertical e o
vetor x na horizontal, digite:
> plot(x,y)
Gráfico de dispersão do vetor idade(x) na horizontal e o vetor
salário(y) na horizontal
49
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
18 20 22 24 26
300
500
700
900
idade
sala
rio
Plotando uma matriz – Para plotar duas colunas ou linhas de uma matriz
M digite:
> plot(M[ ,2], M[ ,3]) ou > plot(M[2, ], M[3, ])
Plotando um número complexo – Se z é um número complexo, digite:
> plot(z)
A parte real de z está no eixo horizontal e a parte imaginária de z está no eixo
vertical.
16.2 Plotando funções matemáticas
Para traçar o gráfico de uma função, precisamos criar dois vetores: um com os
valores de x e o outro com os valores de y , resultantes da aplicação da função.
Programa 27.
50
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
16.3 Criando múltiplos gráficos por página
O default do número de gráficos mostrado na página é um. Para criar uma tela com
mais de um gráfico, use os comandos, mfrow() e mfcol() argumentos como
parâmetros da função, par().
Para criar uma matriz de gráficos 1x2 preenchida por linha, digite:
> par(mfrow = c(1,2))
Para criar uma matriz de gráficos 1x2 preenchida por coluna, digite:
> par(mcol = c(1,2))
Para começar uma nova tela com múltiplos gráficos, empregue um
novo comando par(mfrow = . . .) ou par(mfcol = . . .).
Para retornar um gráfico por página use, par(mfrow = c(1,1)).
Programa 27.
51
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
0 1 2 3 4 5 6
-1.0
-0.5
0.0
0.5
1.0
Função Seno
x
f(x) =
sen
(x)
0 1 2 3 4 5 6
-1.0
-0.5
0.0
0.5
1.0
Função Cosseno
x
f(x) =
cos
(x)
16.4 Selecionando tipos de gráficos e cores
Tipos: os gráficos podem ser apresentados por alguns tipos de desenhos, através
da opção type, no comando plot():
> plot(x, y, type = "opção")type = "opção" Tipo de Gráfico
type = "p" Ponto
type = "l" Linha
type = "b" Linha e pontos: separados
type = "o" Linha e pontos: unidos
type = "h" Linha vertical para cada ponto
type = "s" Saltos
type = "s" Eixos x , y e rótulos
type = "c" Linha com falha nos pontos
Se você quiser saber mais sobre os parâmetros gráficos,
digite:
?par.
Cores: A diversidade de opções de cores disponíveis (657), torna a linguagem
R, uma ferramenta muito versátil na produção de gráficos e no tratamento de
imagens.
52
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
ObservaçõesPara maiores informações sobre cores (help), digite:
> ?colorsPara saber mais sobre as 257 cores, digite:
> cl <- colors()
Mostra a quantidade de cores:
> length(cl)
Lista as vinte primeiras cores:
> cl[1:20]
Programa 27.
18 20 22 24 26
300
500
700
900
idade
sala
rio
Gráfico linha
18 20 22 24 26
300
500
700
900
idade
sala
rio
Gráfico p.l.sep.
18 20 22 24 26
300
500
700
900
idade
sala
rioGráfico p.l.junt.
18 20 22 24 26
300
500
700
900
idade
sala
rio
Gráfico l.v.
18 20 22 24 26
300
500
700
900
idade
sala
rio
Gráfico saltos
18 20 22 24 26
300
500
700
900
idade
sala
rio
Gráfico linha.f
Selecionando cores para outras partes do gráfico – Programa 28.
A seguir listamos as partes de um gráfico R, cujas cores podem ser alteradas:Parte do gráfico comando = "opção"
Titulo principal col.main = " cor"
Subtítulo col.sub = "cor"
53
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Eixos coordenados col.axis = "cor"
Rótulo dos eixos x e y col.lab = "cor"
Cor de um ponto no gráfico points(x,y,col = "cor")
O comando points(x,y...) seleciona pontos e não cores.
16.5 Selecionando linhas e caracteres
Selecionando tipos de linhas
Por default a linha (l) mostrada no gráfico é do tipo sólida. Para mudar, para um
outro tipo de linha , digite:
> plot(x, y, lty = n)
Onde: n = 1, 2, . . . , 8.
Selecionando e adicionando caracteres
Por default o caracter mostrado no gráfico de ponto é " ". Para mudar, para um
outro tipo de caracter, digite:
> plot(x, y, pch = n)
Onde: n = 1, 2, . . . , 18, (triângulo, diamante, etc)
Podemos também inserir um caracter qualquer, digitando:
> plot(x, y, pch ="símbolo")
Programa 28.
0 1 2 3 4 5 6
-1.0
-0.5
0.0
0.5
1.0
Gráfico da Função Seno
Valores de x em radianosx
f(x) =
sen
(x)
16.6 Adicionando linha, texto e legenda
54
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Adcionando linhas
A função abline adiciona uma ou mais linhas ao gráfico, após este ter sido
desenhado pelo comando plot. Sua sintaxe é dada por:
abline(coordenadas dos pontos)
Adicionando texto
Para adicionar um texto em um gráfico já existente, empregue o comando a seguir:
> text(x, y, . . . )
Onde, x e y são as coordenadas de localização do texto. O default de posicionamento
do texto é centrado no ponto escolhido. Você pode mudar este posicionamento, com a
opção adj = tabulação.A seguir vamos dar um exemplo de como podemos adicionar o texto das linhas de uma tabela ao
gráfico (muito importante).
10.0115Primatas Peso médio do corpo(kg) Peso médio do cérebro (g)
GorillaPotar
monkey
207.0 406
Humano 62.0 1320
Rhesus monkey 6.8 179
Chimpanze 52.2 440
Programa 28.
0 50 100 150 200 250
050
010
0015
00
Relação entre o peso do corpo e peso do cérebro em primatas
Peso do corpo(Kg)
Pes
o do
cér
ebro
(g)
Potar monkey
Gorilla
Humano
Rhesus monkey
Chimp.
Adicionando legenda
55
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Para adicionar uma legenda, digite:
> legend(x, y, . . .)
Onde, x e y são as coordenadas de localização da legenda.
Programa 28.
0 1 2 3 4 5 6
-1.0
-0.5
0.0
0.5
1.0
Gráfico da Função Seno
Valores de x em radianosx
f(x) =
sen
(x)
y = sen(x)
y = sen(x)
16.7 Identificando e localizando pontos
Duas funções estão disponíveis para fazer a identificação e localização de pontos no
gráfico. Primeiro desenhe o gráfico, depois aplique uma das funções:
identify() – Rotula pontos. Posicione o cursor próximo ao
ponto a ser identificado e pressione o botão esquerdo do
mouse.
A função identify() requer a especificação dos vetores x e y , como também
um vetor de nomes(caracter) usado com rótulo.
locator() – Imprime a saída que você deseja em nas
coordenadas de um ponto. Posicione o cursor no local que
pretendido e pressione o botão esquerdo do mouse.
No exemplo a seguir, identificamos apenas o primata (Humano).
Programa 28.
56
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
0 50 100 150 200 250
050
010
0015
00
Relação entre o peso do corpo e peso do cérebro em primatas
Peso do corpo(Kg)
Pes
o do
cér
ebro
(g) Humano
16.8 Mais de um gráfico em um mesmo sistema de eixos
Em muitos trabalhos é comum fazer a apresentação de mais de um gráfico em um
mesmo sistema de coordenadas, principalmente para fazer comparações. Isto é
possível no R, veja gráfico a seguir.
Programa 28.
-1.0
-0.5
0.0
0.5
1.0
Gráficos das Funções Seno e Cosseno
x
sen(
x) e
cos
(x)
0 2 3 2 2
y = sen(x)y = cos(x)
17. Linhas e polígonos
57
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
A função lines liga as coordenadas dos pontos(x,y) , formando segmentos
de reta, através do comando:
lines(x, y, type = "l", col = "cor", lty = "lty", ...)
Para construir um polígono qualquer, ligando os pontos com o comando lines,
siga a seqüência de operações:
1. Defina as coordenadas dos pontos (x,y) dando os vetores os x e y ,
> x <-c(x1 , x2 , . . . ,xn )
> y <-c(y1 , y2 , . . . ,yn )
2. Empregue o comando plot para assinalar os pontos no sistema de coordenadas,
podendo empregar as opções gráficas do comando plot e os parâmetros
gráficos (par),
> plot(x,y, . . .)
3. Empregue o comando lines e opções deste comando para ligar os
pontos por linhas.
Programa 29.
A função polygon desenha um polígono se conhecemos as coordenadas dos
vértices pontos(x,y) , através do comando:
polygon(x,y, type = "linha", col = "cor", lty = "lty",...)
Para construir um polígono qualquer, siga a seqüência de operações:
1. Defina as coordenadas dos pontos (x,y) dando os vetores os x e y ,
> x <-c(x1 , x2 , . . . ,xn )
58
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> y <-c(y1 , y2 , . . . ,yn )
2. Empregue o comando plot para assinalar os pontos no sistema de coordenadas,
podendo empregar as opções gráficas do comando plot e os parâmetros
gráficos (par),
> plot(x,y, . . .)
3. Empregue o comando polygon e opções deste comando para desenhar
o polígono.
Programa 29.
AplicaçõesDesenhar a área entre o eixo dos x e uma função f.
Dada a função f(x) = x2 , desenhar a área entre a função e os valores de x
= - 2 e x = 2.
Programa 29.
-3 -2 -1 0 1 2 3
02
46
8
x
f(x)
59
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Desenhar a área entre as funções f(x) = x2 e g(x) = x2 + 10sen(x).
Programa 29.
-6 -4 -2 0 2 4 6
010
2030
40
A "função" polígono
17.1 Segmentos, setas e retângulos
A função segments desenha segmentos de retas através de pares de pontos
(x1 , y1), (x2 , y2), através do comando:
segments(x1, y1, x2, y2,
type = "linha", col = "cor", lty = "lty",...)
Se for dados dois vetores x1 , y1 , temos a seqüência de pontos:
(x1[1], y1[1] ; x2[1], y2[1])
(x1[2], y1[2] ; x2[2], y2[2])
. . . . . . . . . . . . . .
(x1[n], y1[n] ; x2[n], y2[n])
A função arrows desenha setas no segundo ponto de um par de pontos pontos
((xi , yi) , (xi+1 , yi+1)) , com comprimento igual ao do segmento formado
pelos pontos, através do comando:
arrows(x1, y1, x2, y2, length = 0.25,
type = "linha", col = "cor", lty = "lty",...)
A função rect desenha retângulos dadas as suas coordenadas (xesquerda ,
ybase); (xdireita ,ytopo), através do comando:
60
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
> rect(xe, yb, xd, yt, length = 0.25,
type = "linha", col = "cor", lty = "lty",...)
Programa 29.
0 1 2 3 4
01
23
45
x
y
0 1 2 3 4 5
0.0
0.5
1.0
1.5
2.0
2.5
3.0
Adição e Subtração de Vetores
x
y
V.R.53
18. Análises de informações por grupos
Esta é uma prática muito comum quando trabalhamos com muitos dados e, queremos
obter informações por categorias ou grupos.
18.1 Comando aggregate
Uma operação muito comum realizada em um banco de dados (tabela) é a análise da
informação para os níveis de um fator ou combinação de níveis de vários fatores. Esta
61
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
operação pode ser realizada pelo R empregando-se os comandos aggregate ou o comando by.
Sintaxe:> aggregate(x, by, FUN, ...)
x = objeto com as variáveis selecionadas,
by = list(fator1, fator2,. . .),
FUN = função qque vai realizar uma ação.
O comando aggregate, agrega as linhas de x pelos níveis de by e aplica a
função às colunas de cada grupo.Programa 30.
Média de salários e idade por nível de instrução
Group.1 salario idade
1 1o.Grau 7.84 37
2 2o.Grau 11.53 33
3 Superior 16.47 33
18.2 Comando by
As linhas do data frame são divididas pelos valores de um ou mais fatores. A
função é aplicada a cada sub-data frame.
> by(data, índices, FUN, ...)
data = um objeto R, normalmente um data frame, ou uma
matriz.
índices = um fator ou uma lista de fatores, cada um com
tamanho "nrow x".
FUN = função que vai realizar uma ação.
Logo, a função by permite particionar um data frame em um ou mais índices
de categorias e aplica a função, tendo como resultado subconjuntos de um data
frame.
62
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Programa 30.
INDICES: 1o.Grau
[1] 7.84
--------------------------------------------------------------
INDICES: 2o.Grau
[1] 11.53
--------------------------------------------------------------
INDICES: Superior
[1] 16.47
18.3 Comando split
O comando split, separa os dados do vetor x, nos grupos definidos pelos níveis
do fator, e , retorna uma lista de vetores. Esta função é extremamente útil para
gerar relatórios e fazer análises por grupos.
Sintaxe:> split(x, factor,...)
x: vetor ou data frame contendo os valores a ser dividido
pelos grupos.
factor: um "fator", com seus níveis definindo os grupos,
podendo também incluir interação entre os fatores.
Programa 30.# Quebra da tabela "milsa": o fator região dentro do fator
instrução
$Superior
civil instrucao filhos salario idade regiao
19 solteiro Superior NA 10.53 25 interior
24 casado Superior 0 12.79 26 outro
31 solteiro Superior NA 16.22 31 outro
33 casado Superior 3 17.26 43 capital
34 solteiro Superior NA 18.75 33 capital
63
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
36 casado Superior 3 23.30 42 interior
18.4 Comando cut
O comando cut divide a amplitude de um vetor x em intervalos associando a
cada intervalo os valores do vetor x , sendo que cada intervalo, transforma-se em
um nível de um fator.,
Sintaxe:> cut(x, breaks, labels = NULL, include.lowest = FALSE,
right = TRUE, dig.lab = 3, ...)Programa 30.
[4,8) [8,12) [12,16) [16,20) [20,24)
10 12 8 5 1
19. A vetorização de ciclos
O R contém um conjunto de meta-funções que possibilitam substituir ciclos de
forma eficiente. Funções estas, que têm uma estrutura de dados e uma função como
argumentos e aplicam a função aos elementos da estrutura de dados.
Para Arrays, empregam-se as seguintes meta-funções:- apply(array, dimensão, função)
- tapply(vetor, factor, função)
Para Listas, empregam-se as seguintes meta-funções:- sapply(lista, função,. . .)
- lapply(lista, função,. . .)
O comando "apply"
A função apply aplica uma função (mean, sum, etc.) a cada
coluna ou linha de um data frame, matrix ou array. É
similar ao comando by.
Sintaxe:apply(array, dimensão, função)
- dim:
64
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
1 – linhas, 2 – colunas, 3 – c(1:2) linhas e colunas.
Programa 31.
# Aplicando o comando "apply"
Prova.1 Prova.2 Prova.3 TOTAL
Adriano 7.5 6.9 8.2 22.6
Pedro 8.1 7.3 6.7 22.1
Joana 5.9 6.8 9.0 21.7
Mario 7.8 7.0 7.5 22.3
Cintia 8.8 7.9 6.4 23.1
TOTAL 38.1 35.9 37.8 111.8
Os comandos "lapply e sapply"
- lapply
O comando lapply, aplica uma função a todos os componentes de um vetor
x ou lista, e , retorna o resultado em forma de uma lista.
Sintaxe:> lapply(vetor, FUN, ...) ou lapply(lista, FUN, ...)
- sapply
O comando "sapply" , aplica uma função a todos os componentes de um vetor
x ou lista, e, retorna em forma de um vetor. Assim, "sapply"
é uma versão amigável de lapply, simplificando o resultado para um vetor ou
matriz, com os nomes das colunas("s" é de "simplify").
Estes comandos podem ser aplicados à vetores, listas ou arrays.
Sintaxe:> sapply(x, FUN,...) ou sapply(lista, função)
Programa 31.
# Aplicando o comando "lapply"
$peso
[1] 50
65
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
$altura
[1] 1.65
# Aplicando o comando "sapply"
peso altura
50.00 1.65
O comando "tapply"
O comando tapply agrupa os elementos do vetor pelos níveis do fator e , a
cada grupo aplica a função..
Sintaxe:> tapply(vetor, factor, FUN,...)
Programa 31.
# Calcula as médias dos salário por nível de instrução
1o.Grau 2o.Grau Superior
7.84 11.53 16.47
# Tabela de dupla entrada(região x civil) para salário
regiao
civil interior capital outro
solteiro 8.03750 11.54750 9.94875
casado 13.30625 11.40286 11.24000
20. Análises estatísticas com o R
Na introdução ao R não se mencionou a palavra estatística, muito embora muitas
pessoas utilizem o R como um sistema estatístico. Nós preferimos descrevê-lo como
um ambiente sobre o qual se implementaram muitas metodologias estatísticas, tanto
clássicas como modernas. Muitas dessas fazem parte do ambiente R , e outras
acompanham o R sob a forma de bibliotecas ou "packges" e muitas outras
estão disponíveis no site, http://www.r-project.org.
66
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Existe uma diferença fundamental entre a filosofia do R e outros sistemas estatísticos.
Em R, uma análise estatística é realizada em uma série de passos, em que os
resultados intermediários vão sendo armazenados sob a forma de objetos, que por sua
vez serão a entrada para análises subseqüentes, obtendo-se no final um conjunto
minimizado de resultados, enquanto que outros sistemas estatísticos, tais como SAS ou
SPSS, se obtem de imediato uma extensa lista de output para qualquer análise, por
exemplo, as regressões lineares e análises multivariadas.
20.1 Análises de variáveis qualitativas e quantitativas
Algumas variáveis, como sexo, educação, estado civil, nível de instrução, apresentam
como possíveis realizações uma qualidade (ou atributo) do indivíduo pesquisado, ao
passo que outras, como número de filhos, salário, idade, apresentam como possíveis
realizações valores numéricos, resultado de contagens ou mensurações. As variáveis
do primeiro tipo são denominadas qualitativas, e as do segundo tipo são
denominadas de variáveis quantitativas.
Variáveis qualitativas
A forma mais usual e simples de se descrever variáveis qualitativas é com o uso de
tabelas. Com o R é possível, como já observamos anteriormente, em alguns exemplos ,
construir tais tabelas, mas não existe um instrumental adequado para uma formatação
de alto nível para a apresentação de tabelas.
Vamos usar o mesmo banco de dados (milsa) que vínhamos trabalhando para
exemplificar.
TabelasPrograma 32.
# Tabela Simples: instrução
1o.Grau 2o.Grau Superior
12 18 6
# Tabela de Dupla Entrada: civil x instrução
67
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
instrucao
civil 1o.Grau 2o.Grau Superior
solteiro 7 6 3
casado 5 12 3
Gráficos
Os gráficos para representações de tabelas das variáveis qualitativas, são do tipo
barras horizontais ou verticais, setores, que podem ser obtidos através do R.
Gráfico de setores
1o.Grau
2o.Grau Superior
Gráfico de Setores-Instrução
Gráfico de barras
68
R - Introdução à Programação e Aplicações Joaquim Pereira Neto1o
.Gra
u2o
.Gra
uS
uper
ior
Nivel de Instrução
Freqüência
Nív
el d
e In
stru
ção
0 5 10 15 20
Variáveis quantitativas
Para as variáveis quantitativas, podemos fazer uma análise descritiva, tanto através
de gráficos como das medidas de tendência central: medidas de dispersão, assimetria,
etc. Vamos nos limitar neste curso, apenas uma análise gráfica das variáveis
quantitativas.
Programa 32.
01
23
45
67
Gráfico de Frqüências
No.Filhos
Freq
üênc
ia
0 1 2 3 5
69
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Histograma de Salários
No.de Salários
Freq
üênc
ia
4 8 12 16 20 24
02
46
810
1214
21. Gráfico Box – Plot
Este gráfico é uma contribuição importante dada por Tukey (1977). É um gráfico simples,
pois, trabalha basicamente com cinco números: primeiro quartil(q1), mediana (q2 ), terceiro
quartil (q3 ) e os extremos inferior(ei ) e superior (es).
Como uma ferramenta visual, podemos utilizá-lo para ilustrar os dados, para estudar
simetria, dispersão, caudas, outliers e comparar diferentes populações. Este gráfico contém
um retângulo, usualmente orientado com o sistema de coordenadas, tal que, o eixo vertical,
ou horizontal, tem a mesma escala do conjunto de dados.
A parte superior e a inferior do retângulo coincidem com o terceiro quartil e o primeiro
quartil dos dados. A caixa, formada pelo retângulo, está dividida por uma linha horizontal
que corresponde o valor da mediana.
A partir do retângulo para cima, segue uma linha até o ponto mais remoto que não exceda
1.5 vezes o intervalo interquartil, denominado limite superior. De modo similar, define-se o
limite inferior. As caudas vão dos extremos da caixa até os pontos que não ultrapassem os
limites superior e inferior. As observações que estiverem acima do limite superior ou abaixo
do limite inferior, serão chamadas de outliers e representados por um ponto em destaque.
Sintaxe:
box(x, . . . )
70
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
x: um vetor numérico ou um modelo (y ~ x1....)
Programa 32.
510
1520
Box - plot: Salários
Sal
ário
s
mediana
média
Box - plot paralelos
Uma representação de box plots paralelos, pode facilitar a comparação de vários
conjuntos de dados. Dessa representação podemos extrair semelhanças e diferenças
entre vários conjuntos de dados.
Exemplo
Em uma fase de um experimento realizado para se estudar diabetes gestacional,
desejava-se avaliar o comportamento da hemoglobina (HbA) em gestantes normais
(n), gestantes com tolerância diminuída (td) e gestantes diabéticas (d). Para isso
foram escolhidas aleatoriamente 10 gestantes de cada tipo e mediu-se suas HbAs.
No programa, os tratamentos: n = a , td = b, d = c
Interprete as informações sobre assimetria e dispersão dos tratamentos, como também
a comparação entre as médias de tratamentos.
71
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
a b c
78
910
Gráfico Boxplot
Tratamentos
Hem
oglo
bina
(HbA
)
abc
22. Ajuste de uma reta de mínimos quadrados
Uma reta de mínimos quadrados é ajustada muito facilmente aos dados, ou seja, aos
valores observados (xi,yi), através do R.
Programa 32.
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.5659 3.8311 0.670 0.5075
idade 0.2474 0.1088 2.274 0.0294 *
--------------------------------------------------------------
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
--------------------------------------------------------------
Residual standard error: 4.336 on 34 degrees of freedom
Multiple R-Squared: 0.132, Adjusted R-squared: 0.1065
72
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
F-statistic: 5.172 on 1 and 34 DF, p-value: 0.02938
20 25 30 35 40 45
510
1520
Ajuste de uma reta de mínimos quadrados
idade
Sal
ário
23. Curvas de níveis ou contornos e perspectiva tridimensional
Dados os pontos de um levantamento topográfico, traçar as curvas de níveis e mostrar
uma perspectiva tridimensional.
Programa 33.
73
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
10 20 30 40 50 60 70
010
2030
4050
60
Gráfico de Contorno
x
y
zPerspectiva tridimensional
24. Recursos R
24.1 Pacotes R para WindowsPara informações sobre os pacotes disponíveis para o R e material e
download, visite a página Web:http://www.cran.r-project.org
74
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
Para download, do programa R, procure a opção Windows(and later),
base(Binaries), R.2.2.0-win32.exe.
24.2 Literatura escrita por especialistaQuase toda a literatura escrita para o S-PLUS é aplicada ao R.
Alzola, C. and Harrell, F. 1997. An Introduction to S and the
Hmisc and Design Packages.
Burns, P. J. A Guide for the Unwilling S User. [Available from
CRAN sites]
Chambers, J. M. 1998. Programming with Data. A Guide to the S
Language. Springer-Verlag, New York.
Chambers, J. M. and Hastie, T. J. 1992. Statistical Models in S.
Wadsworth and Brooks Cole Advanced Books and Software,Pacific
Grove CA.
Dalgaard, P. 2002. Introductory Statistics with R. Springer, New
York.
Fox, J. 2002. An R and S-PLUS Companion to Applied Regression.
Sage Books.
Maindonald J H and Braun W J 2003. Data Analysis and Graphics
Using R – An Example-Based Approach. Cambridge University Press.
Krause, A. and Olsen, M. 1997. The Basics of S and S-PLUS.
Springer 1997.
Spector, P. 1994. An Introduction to S and S-PLUS. Duxbury Press.
Venables, W.N., Smith, D.M. and the R Development Core Team. An
Introduction to R. Notes on R: A Programming Environment for Data
Analysis and Graphics.
Venables, W. N. and Ripley, B. D., 4th edn 2002. Modern Applied
Statistics with S. Springer, NY.
Material Suplementar deste Livro está disponível em:
http://www.stats.ox.ac.uk/pub/MASS4/
Observe que o resultado da operação é precedido por um [1]. Isto é apenas para
indicar que o resultado "8" é o primeiro elemento retornado pelo programa.
Vamos praticar com outros exemplos:
> 2 + 3*4 # prioridade da operação multiplicação
75
R - Introdução à Programação e Aplicações Joaquim Pereira Neto
[1] 14
> 3/2+1 # prioridade da operação divisão
[1] 2.5
> 2 * 3 ^ 2 # potências são indicadas por ^ ou **
[1] 18
76