Apostila - Introdução Ao R
Apostila - Introdução Ao R
AO AMBIENTE R
Professores:
Jayme Augusto Prevedello e Vinicius Neres de Lima
Rio de Janeiro
2020
Nota: o conteúdo desta apostila foi elaborado com base principalmente na apostila de Landeiro, VL,
Zucco, CA e Menezes, JFS, “Introdução ao uso do programa R”, versão de 14 de março de 2011, e
destina-se exclusivamente para uso em sala-de-aula no contexto da disciplina “Introdução a pacotes
estatísticos: Introdução ao Ambiente R”, do PPGEE/UERJ.
AULA 1
- Clique em File > New Project > New Directory > New Project (ou “Empty Project”, dependendo
da versão do seu RStudio). Em “Directory name:”, coloque “Aula1”. Selecione em “Brownse” a pasta do
seu computador onde deseja salvar. Pronto! Agora já podemos trabalhar dentro do RStudio.
IMPORTANTE: Repita estes passos no início de cada aula, criando sempre uma pasta separada para
cada aula (Aula2, Aula3...Aula5).
O RStudio possui três janelas principais, que conheceremos aos poucos. Por enquanto, vamos
focar na janela principal, à esquerda (“Console”). Essa janela, irá receber todos os comandos que iremos
digitar. O símbolo “>” indica que o console está pronto para receber comandos.
Digite no console os comandos abaixo, um de cada vez (lembre-se de apertar o Enter), e observe o
resultado:
2+2
2-2
2*2
2/2
2^2
Para realizar contas mais complexas, é importante utilizar parênteses, para separar as etapas do cálculo
adequadamente (assim como fazemos no Excel). Por exemplo, compare os resultados das duas contas
a seguir:
2+2*3
(2+2)*3
Você pode adicionar comentários aos seus comandos, com o símbolo “#”. Esses comentários são muito
úteis para organizar seus comandos e relembrar mais tarde o que eles estão fazendo:
(2^2)*3 # dois elevado a dois; o resultado é multiplicado por 3
A função para calcular logaritmos é log(x,base). Como default, a base do logaritmo é o algarismo
neperiano “e” (2,718282), portanto:
2
log(5) # log neperiano (natural) de 5
log(5,10) # log de 5 na base 10
No exemplo anterior, criamos dois objetos do tipo vetor (va e vb); o vetor é o tipo mais simples de objeto
do R. Um vetor pode guardar mais de um valor:
vc <- c(1,5,8)
vc
Neste caso, como temos mais de um elemento, precisamos da função c() para combiná-los (chamada
de “concatenar” ou combinar). Veja o que acontece se você esquecer das vírgulas ou do c:
vc <- (1,5,8) # erro! faltou o c
vc <- c(1 5 8) # erro! faltou colocar as vírgulas
Por definição, um vetor é “uma sequência de valores do mesmo tipo”; esses valores podem ser
numéricos (1,2,3...), caracteres (“joao”, “maria”, “jose”) ou lógicos (TRUE, FALSE). Exemplos:
valores <- c(1,2,3,4,5)
valores
respostas <- c(TRUE, FALSE) # OBS: c(T, F) dá o mesmo resultado que c(TRUE, FALSE)
respostas
IMPORTANTE: observe que, no caso de caracteres, precisamos colocar aspas entre os nomes dos
elementos. Veja o que ocorre quando esquecemos das aspas:
nomes <- c(joao, maria, jose) # tente entender a mensagem de erro...o que ela quer
dizer, exatamente??
Nesse caso, o R converte os números para caracteres, já que é impossível fazer o contrário (converter
caracteres em números). Para confirmar isso, use o comando class:
class(meu_vetor)
Para praticar, vamos criar alguns vetores. Primeiro, vamos criar um vetor para guardar os valores de
riqueza de aves coletadas em 10 fragmentos florestais:
3
aves <- c(22,28,37,34,13,24,39,5,33,32)
aves
A função length() (do Inglês “comprimento”) retorna o número de observações dentro do objeto:
length(aves) # um erro comum é digitar lenght(aves) – teste para ver o que acontece!
Vamos usar nosso conhecimento sobre vetores, e sobre algumas funções, para calcular a média dos
dados das aves. Lembre-se que, para calcular uma média, basta dividir a soma dos valores pelo número
de observações (n):
soma.aves <- sum(aves) # soma dos valores
n.aves <- length(aves) # número de observações (n)
media.aves <- soma.aves/n.aves # cálculo da média
Para ver os resultados basta digitar o nome dos objetos que você criou:
n.aves # para ver o número de observações (n)
soma.aves # para ver a soma
media.aves # para ver a média
4
1.7. UMA PAUSA – PEDINDO AJUDA NO R: HELP
Vimos até aqui várias funções: mean, sum, length, log etc. Toda função do R possui uma página
de ajuda (help) associada. Você pode acessar essa página com a função help:
help(sum)
Invista um tempo para olhar com calma a página de ajuda. A parte final dessa página contém exemplos,
que você pode copiar e colar no console do R. Daqui pra frente, sempre que ficar em dúvida sobre como
usar uma função, consulte o help dela.
Caso tenha digitado um valor errado e queira corrigir o valor, especifique a posição do valor e o novo
valor. Por exemplo, o primeiro valor de aves é 22. Caso tivesse sido digitado errado (ex: deveria ser 100),
basta alterarmos o valor da seguinte maneira.
aves[1] <- 100 # coloca 100 na primeira posição, substituindo o 22
aves
aves[1] <- 22 # para voltar ao valor antigo
1.9.2. Repetições
A função rep(x,vezes=n) gera repetições do valor x, n vezes. Por exemplo, se quiser gerar um ve
tor contendo o número 5, 20 vezes, sem ter que digitar tudo:
rep(5,20) # repete o número 5, vinte vezes
5
rep("a",5)
rep(1:4,3)
Você pode usar o argumento each, dentro dessa função – digite o comando abaixo, e compare com o
anterior:
rep(1:4, each=3)
rep(c("A","B"),5) # repete AB cinco vezes.
rep(c("A","B"), each=5) # repete A cinco vezes, depois B cinco vezes.
Para criar uma sequência de n valores aleatórios, podemos usar a função runif(n, min, max).
Os valores são amostrados ao acaso pelo R, com base numa distribuição uniforme (por isso “runif”),
variando de min a max:
runif(10,80,100) # 10 valores com mínimo de 80 e máximo 100
temp <- runif(200,80,100) # Gera novamente, mas agora são 200 valores e salva no
objeto temp
hist(temp) # Faz um histograma de frequências dos valores
Para gerar valores aleatórios com uma distribuição normal, é necessário indicar a média e o desvio
padrão, ou seja, rnorm(n, mean, sd):
rnorm(10,0,1) # 10 valores com média 0 e desvio padrão 1 (o default da função é mean=0
e sd=1)
temp2 <- rnorm(200,8,10) # 200 valores com média 8 e desvio 10
hist(temp2) # Faz um histograma de frequência dos valores
hist(rnorm(200,8,10)) # Os dois comandos acima, reunidos em apenas um. Repita este
comando algumas vezes, e veja se os gráficos parecem com uma distribuição normal. Por
que os valores mudam cada vez que você repete o mesmo comando?
1.9.4. Amostragem
Para obter amostras aleatórias de um conjunto de valores, podemos usar a função sample(x, size=y,
replace = FALSE):
sample(1:10,5) # tira 5 amostras do conjunto de valores entre 1 e 10
sample(1:10,20) # erro! O que aconteceu aqui?
Como o replace, por default, é falso (replace=FALSE), é impossível tirar 20 amostras sem reposição
de um conjunto com 10 valores. A solução é amostrar com reposição (replace=TRUE):
sample(1:10,20, replace=TRUE) # ok!
Vamos criar uma moeda e "jogá-la" para ver quantas caras e quantas coroas saem em 10 jogadas.
moeda <- c("CARA","COROA")
sample(moeda,10) # erro! Por quê?
sample(moeda,10, replace=TRUE)
Vamos testar se essa função consegue amostrar aleatoriamente mesmo. Vamos jogar essa moeda
100 vezes e ver quantas caras e quantas coroas temos:
teste <- sample(moeda, 1000, replace=TRUE)
table(teste) # a função table() faz uma tabela de frequência dos valores
6
sort(exemplo) # para colocar em ordem crescente
[1] 5 7 9 14 55 61 67 77 88 97 # novamente: seus valores serão diferentes dos
mostrados aqui!
sort(exemplo, decreasing=TRUE) # para colocar em ordem decrescente
[1] 97 88 77 67 61 55 14 9 7 5
Já a função order(objeto) retorna a posição original dos valores de um objeto, em ordem crescente.
Ou seja, ele retorna a posição do menor valor, a posição do segundo menor valor, a posição do terceiro
menor valor etc.:
exemplo # este é o objeto original
[1] 7 14 61 97 5 77 9 55 88 67
order(exemplo) # este comando mostrará a posição do menor valor, depois a posição do
2º menor valor etc.
[1] 5 1 7 2 8 3 10 6 9 4 # o menor valor de “exemplo” (que é 5) ocupa a 5ª posição;
o segundo menor valor de “exemplo” (que é 7) ocupa a primeira posição; etc.
Dedique um tempo para entender bem a diferença entre sort(exemplo) e order(exemplo). Esses
dois comandos são muito úteis para reordenar uma planilha inteira, como veremos nas próximas aulas.
Para criar matrizes podemos juntar inúmeros vetores que já existem, ou usar o comando
matrix(sequência,linhas,colunas), que distribui a sequência na matriz de dimensões que você
indicou. Vamos supor que temos estimativas de riqueza de comunidades de aves, de 5 locais, amostrados
em duas estações diferentes. Podemos organizar os dados usando uma matriz:
aves2 <- matrix(c(22,28,37,34,13,24,39,5,33,32),5,2) # cuide com os parênteses!
Observe que há uma função c() dentro da função matrix()
aves2
Como já criamos anteriormente um objeto para guardar as riquezas, chamado aves, podemos criar a
mesma matriz de outra forma:
aves2 <- matrix(aves,5,2) # matriz com os valores de aves organizados em 5 linhas e
2 colunas
aves2
Lembra que o comando length(x) retorna o comprimento (ou número de elementos) de um vetor?
Analogamente, o comando dim(x) retorna as dimensões da matriz, ou seja, o número de linhas e
colunas:
dim(aves2)
Obs: a função length() ‘funciona’ para outros objetos, além de vetores, pois a maioria dos objetos no
R são construídos com base em vetores. Veja, por exemplo, o que acontece fazendo length(aves2)
ou aves2+1:10.
1.11. EXERCÍCIOS
(modificados de Landeiro, Zucco e Menezes, 2010. Introdução ao uso do programa R)
1. Você estimou o número de árvores em cada uma de suas parcelas no campo: 18, 14, 14, 15, 14, 34,
16, 17, 21, 26. Salve estes valores no R, em um objeto chamado de “abund”. Usando as funções do R,
encontre a abundância máxima, mínima e média.
1.1. O valor 34 foi anotado de forma errada; ele na verdade é 15. Sem digitar tudo novamente, e usando
colchetes [ ], mude o valor e calcule novamente a abundância média.
2. Tente prever o resultado dos comandos abaixo. Pense primeiro; a seguir, execute os comandos e
confira o resultado:
7
2.1. x <- c(1,3,5,7,9)
2.2. y <- c(2,3,5,7,11,13)
2.3. x+1
2.4. y*2
2.5. length(x) e length(y)
2.6. x + y
2.7. y[3]
2.8. y[-3]
3. Todos os anos, o trinta-réis-ártico (Sterna paradisuea), uma avezinha preta e branca, com pouco menos
de 40 centímetros, realiza um longo voo de pólo a pólo. Durante nove meses, ele percorre 20000
quilômetros, do Círculo Polar Ártico até o limite da Antártida, e retorna, então, ao ponto de partida.
Usando o R, em apenas uma linha de comando, calcule a velocidade média em m/s dessa ave
(assumindo que 1 mês tem 30 dias).
4. Calcule |2^3-3^2|, ou seja, o módulo de 2 elevado a 3 menos 3 elevado a 2. Faça isso em apenas uma
linha de comando.
5. Suponha que você coletou 10 amostras em duas reservas, as 5 primeiras amostras na reserva A, e as
demais na reserva B. Crie um objeto chamado "locais" para especificar as reservas onde as amostras
foram coletadas. Dica: a função rep pode ajudar aqui!
6. Você deseja jogar na megasena, mas não sabe que números jogar, entre 1 e 60. Use a função sample
do R para escolher os seis números para você jogar. Neste caso, devemos usar amostragem com ou sem
reposição?
7. Crie uma sequência de valores de 1 a 30, apenas com números ímpares. Dica: a função seq pode
ajudar!
8. Simule o resultado de 25 jogadas de um dado. Você precisará criar o objeto dado, e usar a função
sample. Neste caso, devemos usar amostragem com ou sem reposição?
10. Crie um objeto chamado info que contenha seu nome, idade, e-mail e telefone.
Feche o RStudio: Ao fechar aparecerá um a pergunta sobre salvar ou não o Workspace, diga que sim.
8
AULA 2
Abra o RStudio e crie um novo projeto:
- Clique em File > New Project > New Directory > New Project (ou “Empty Project”, dependendo
da versão do seu RStudio). Em “Directory name:”, coloque “Aula2”. Selecione, em “Brownse”, a pasta
onde deseja salvar no seu computador. LEMBRANDO: Repita estes passos no início de cada aula,
criando sempre uma pasta separada para cada aula (Aula2, Aula3...Aula5).
Fora do R, vá até a pasta recém criada (“Aula2”). Coloque dentro desta pasta os seguintes arquivos,
fornecidos por e-mail pelos professores: “amostras.txt”, “moluscos.txt”, “simu.txt” e “minhocas.txt”.
Para criar um script, dentro do RStudio, clique no símbolo da folha em branco (logo abaixo de File,
no canto superior esquerdo) e selecione R Script. Uma nova janela será aberta, que corresponde ao
script. Digite 3+3 no script e aperte Ctrl+Enter ou Ctrl+R (dependendo da sua versão do RStudio – teste
os dois!). O 3+3 será enviado para o console do R, e o resultado aparecerá na tela inferior. Isso equivale
a digitar 3+3 diretamente no console e apertar Enter; a vantagem é que, digitando no script, deixamos
tudo organizado, e podemos salvar o script. Para salvar seu script, clique em qualquer parte dele e digite
Ctrl+S; coloque o nome que quiser (ex: “ScriptAula2”) e salve na pasta desta aula (Aula2). Outra forma
de salvar seu script é clicar no símbolo do disquete azul, à esquerda de “Source on Save”.
Daqui em diante, use sempre o script para digitar todos os seus comandos, e salve-o
periodicamente.
Primeiro, abra o arquivo “amostras.txt”, fornecido pelos professores, no bloco de notas (fora do
RStudio), apenas para visualizar seu conteúdo. Note que este arquivo contém uma tabela com variáveis
numéricas e categóricas, portanto este é um exemplo de objeto do tipo “dataframe”. Para importar
dataframes em formato “.txt” para o R, a função é read.table. No script do R Studio, digite o comando
abaixo, e depois Ctrl+Enter ou Ctrl+R:
read.table("amostras.txt", header=TRUE)
O argumento header=TRUE informa que os dados possuem cabeçalho, ou seja, a primeira linha contém
os nomes das variáveis.
Nunca se esqueça de criar um objeto para salvar os dados; para isso, neste caso, digite:
macac <- read.table("amostras.txt", header=TRUE) #lembre-se sempre de digitar
Ctrl+Enter ou Ctrl+R, para enviar os comandos ao console
O objeto macac é um objeto do tipo dataframe. Isso quer dizer que macac é um objeto que possui
linhas e colunas (observações nas linhas e variáveis (atributos) nas colunas). Para ver os dados, digite o
nome que você atribuiu ao objeto dentro do RStudio:
macac
Para verificar se os dados foram importados corretamente para o R, verifique a estrutura dos mesmos
com:
Novamente: é fundamental salvar seu script, para não perder os comandos já digitados. Para isso, clique
no símbolo do disquete logo acima do script, ou Ctrl+S. Daqui pra frente, lembre-se de salvar o script
periodicamente.
9
2.2 PROCURAR OS DADOS NO COMPUTADOR
Os comandos para importar dados, como o read.table(), sempre procuram pelos arquivos na
pasta atual de trabalho (“working directory”; no caso, a pasta Aula2). No entanto, você pode chamar
arquivos de outras pastas se souber indicar corretamente o endereço completo do arquivo, por exemplo:
read.table("C:/Users/ja_pr/OneDrive/Introducao ao R_2020/Aula2/amostras.txt")
#este é apenas um exemplo; não vai funcionar no seu computador!
No ambiente Windows, você pode usar tanto a barra simples / ou duas barras invertidas \\, para
indicar o caminho do arquivo. Caso você não lembre o nome do arquivo que deseja importar, existe a
opção de procurar os dados no computador com a função file.choose(). Essa função abre uma caixa
de diálogo, onde você procura pelo arquivo como em outros programas para Windows:
macac <- read.table(file.choose(),header=T) # abre uma caixa de diálogo, que pode
aparecer no RStudio ou na sua barra de tarefas
Você também pode conferir se um determinado arquivo de dados existe na sua pasta atual de trabalho
(working directory):
file.exists("amostras.txt")
Por fim, no Rstudio, há também um atalho para importar tabelas. No painel direito superior, clique em
Import Dataset > From Text (base) (Nota: essa opção pode estar indisponível em versões mais antigas
do RStudio).
Além de importar tabelas, existem opções para criar arquivos do tipo dataframe ou matriz, por dentro
do R. Uma das opções é juntar vetores. Por exemplo, para criar uma matriz, podemos usar “column bind”
cbind(vetor1,vetor2,...) ou “row bind” rbind(vetor1, vetor2,...). Vamos ver como eles
funcionam. Vamos criar três vetores e depois juntá-los em uma matriz. Digite os seguintes comandos, um
de cada vez (seguido de Ctrl+Enter ou Ctrl+R):
aa <- c(1,3,5,7,9)
Importante: para visualizar o objeto aa recém criado, digite o nome do objeto (aa) seguido de Ctrl+Enter
ou Ctrl+R. Outra possibilidade é selecionar com o mouse o nome do objeto (aa) no seu script, e apertar
Ctrl+Enter ou Ctrl+R. Daqui pra frente, se habitue a sempre visualizar o objeto recém criado, para
entender bem o que cada comando está fazendo.
bb <- c(5,6,3,8,9)
cc <- c("a","a","b","a","b")
cbind(aa, bb) # junta os vetores em colunas
rbind(aa, bb) # junta os vetores em linhas
Lembre-se que matrizes, ao contrário de dataframes, podem conter apenas valores numéricos ou apenas
caracteres. Por isso, se juntarmos o vetor cc, nossa matriz será transformada para caracteres:
cbind(aa,bb,cc) # junta os vetores em colunas, mas transforma números em caracteres
Para criar um dataframe, que aceita valores numéricos e de caracteres, use a função data.frame:
data.frame(aa,bb,cc) # agora temos variáveis numéricas e categóricas
Agora vamos aprender a selecionar (extrair) apenas partes do nosso conjunto de dados macac
usando [] (colchetes). Como já vimos, O uso de colchetes para objetos em duas dimensões funciona
assim: objeto[linhas,colunas]. Vejamos:
macac[,1] # extrai a primeira coluna e todas as linhas
macac[,2] # extrai a segunda coluna e todas as linhas
macac[1,] # extrai a primeira linha e todas as colunas
10
Existem outras duas maneiras de extrair dados de uma dataframe. Uma é usando a função
attach(objeto), que torna as variáveis acessíveis no R, apenas digitando o nome delas na linha de
comandos, como se elas fossem objetos também. Para entender, digite macacos na linha de comandos
e veja o que acontece:
macacos
Error: object "macacos" not found
Agora use a função attach(macac), e depois digite macacos novamente, para ver o que acontece:
attach(macac) # torna cada coluna do objeto “macac” acessível como um objeto
macacos # agora os dados da coluna “macacos” estão disponíveis
Atente para o seguinte: se houver algum objeto no workspace com o mesmo nome de alguma
variável do dataframe fixado (exemplo: macacos), o R pode retornar o objeto errado. Para evitar isso:
detach(macac) # desfaz a fixação feita com o attach, para não gerar referência cruzada
com outras variáveis com mesmo nome
Para evitar esses possíveis efeitos indesejados do attach(), existe uma forma melhor de acessar
colunas pelo nome: usar o símbolo cifrão ($), ao invés de attach(). O uso é basicamente o seguinte:
objeto$variável (a variável corresponde à coluna que se deseja extrair). Por exemplo, para extrair a
coluna macacos, use:
macac$macacos
Veremos como formatar os gráficos na próxima aula. Por enquanto, como exercício adicional, faça o
gráfico de frutas X macacos usando colchetes ao invés de $. Repare que o nome das variáveis nos eixos
x e y ficam diferentes, em relação ao gráfico feito usando $.
Pare um momento para estudar o comando acima. Por que usamos os colchetes? Por que, depois da
vírgula, não especificamos quais colunas queríamos? Compare também o resultado do comando acima,
com o resultado de macac (dataframe original); qual a diferença?
O parâmetro decreasing=TRUE/FALSE controla se o ordenamento é crescente ou decrescente. O
default é FALSE. Por isso, para fazer ordenamento decrescente é necessário informar:
macac[order(macac$frutas, decreasing=TRUE), ]
Tome um tempo para entender porque o ordenamento de tabelas funciona com o comando order()
e não com o comando sort(), que vimos na aula passada. Para tanto, vamos decompor o comando
passo a passo. Primeiro, olhamos a função order():
11
order(macac$frutas)
[1] 11 15 8 5 14 19 16 20 18 12 13 6 17 1 2 10 4 7 9 3
Veja que o output indica uma sequência de números que correspondem à posição dos elementos
na coluna macac$frutas, em ordem crescente. Ou seja, os elementos 11 e 15 são os que possuem
menores valores de frutas, seguidos de 8, 5, 14 etc. Ao colocar esse comando dentro de macac[ ,]
estamos dizendo que queremos a sequência de linhas expressas por order(macac$frutas).
Salve seu script!
Nós calculamos a média de macacos por unidade amostral (site), mas sem considerar a reserva
onde as amostras foram coletadas. O que fazer para calcular a média de macacos em cada reserva?
Basta selecionar as linhas correspondentes a cada reserva.
mean(macac[1:10, 3]) # média de macacos na reserva A; repare que estamos selecionando
as linhas 1 a 10 da terceira coluna; faz sentido?
mean(macac[11:20, 3]) # média de macacos na reserva B
Repare que esse objeto contém informações sobre quantidade de chuva em cada site (parcela) e
em qual de duas reservas (A ou B) a parcela estava localizada. Vamos primeiro somar os valores de
colunas ou linhas, usando as funções colSums(objeto) para somar colunas e rowSums(objeto)
para somar linhas:
colSums(mol[ ,2:7]) #Note que estamos somando apenas as informações sobre as seis
espécies (colunas 2 a 7)
rowSums(mol[ ,2:7])
Que informação biológica você obteve ao usar cada um dos dois comandos acima? Pense com calma.
12
2.6. OPERAÇÕES EM SUB-CONJUNTOS - tapply
Porém, imagine esse tipo de solução quando os seus dados forem mais extensos, e você possuir,
por exemplo, coletas em 30 reservas. Você precisaria de um comando para cada reserva (30 linhas de
comandos). Uma alternativa mais elegante e simples é dizer ao R “calcule a média de macacos em cada
unidade amostral por reserva”. O comando tapply( ) executa esse procedimento assim:
tapply(dados, grupos, função)
Essa sintaxe diz que será aplicada uma função (média, por exemplo) a um conjunto de dados (a
coluna macacos, por exemplo), separadamente para cada grupo (a coluna reserva):
Como você faria para calcular a quantidade total de frutas por reserva, com tapply?
NOTA: o comando tapply faz parte de uma família de funções “apply” – que incluem apply, tapply,
lapply, etc. Todas têm a mesma lógica, mas se aplicam a diferentes tipos de objetos – matrizes,
dataframes etc – e retornam os resultados de formas diferentes.
A tabela é grande, por isso fica truncada, o que atrapalha a visualização. Use View()para ver a tabela
de forma mais organizada (repare o V maiúsculo):
View(simu)
Volte ao script e use head para ver o início da tabela:
head(simu)
Note que a coluna 1 mostra os nomes dos riachos; a coluna 2 mostra o nome dos municípios; e as
colunas 3 a 7 mostram os valores das variáveis ambientais. A partir da coluna 8, temos os dados das
espécies (abundâncias).
Primeiro, vamos separar os dados das espécies dos dados ambientais (incluindo os municípios):
ambi <- simu[,2:7] # dados ambientais mais municípios
ambi
spp <- simu[,8:27] # dados das espécies
spp
Vamos fazer gráficos simples, para ver as relações entre as variáveis ambientais:
plot(ambi[ ,"altitude"], ambi[ ,"temperatura"])
13
plot(ambi[ ,"altitude"], ambi[ ,"pH"])
plot(ambi[ ,"condutividade"], ambi[ ,"pH"])
Nota: veremos gráficos em detalhes na próxima aula.
A função pairs()faz um gráfico cruzando todos os pares de variáveis possíveis em um dado objeto.
É um passo inicial da exploração de dados, mas deve ser usado com parcimônia.
pairs(ambi) # se retornar um erro, tente “pairs(ambi[-1])”. Esse comando exclui a
primeira coluna, que contém os nomes dos municípios (que são caracteres, e não valores).
Se a figura ficar muito pequena, ajuste com o mouse o tamanho dos quatro painéis do R,
de forma a aumentar o painel inferior direito
Como podemos calcular a riqueza de espécies, em cada riacho? Primeiro precisamos transformar
os dados de abundância para presença e ausência (1 e 0, respectivamente). Primeiro, vamos criar uma
cópia do arquivo original:
copia <- spp # cópia é igual a spp
Para calcular a riqueza de espécies, basta somar as linhas do arquivo de presença e ausência:
riqueza <- rowSums(pres.aus) # número de espécies por riacho (riqueza)
Agora, aplique a função colSums(), aos objetos pres.aus e spp, para ver em quantos riachos
cada espécie ocorreu e qual a abundância total de cada espécie. Qual espécie ocorreu em mais riachos?
Qual a mais abundante?
Relembrando: o valor -inf ocorre porque não é possível calcular o log de 0. Veja:
log(0)
Agora vamos retornar ao nosso arquivo completo, simu, e ordenar a tabela de acordo com a altitude,
de forma que o primeiro riacho seja o que está localizado em menor altitude.
14
simu[order(simu[ ,"altitude"]), ] # tabela ordenada pela altitude
Agora vamos fazer 4 gráficos da riqueza de espécies em relação a altitude, pH, temperatura e
condutividade (lembrando que veremos gráficos, em detalhes, na próxima aula). Primeiro vamos dividir a
janela de gráficos em 4 partes.
par(mfrow=c(2,2))
Riqueza X altitude:
plot(simu[ ,"altitude"], rowSums(pres.aus))
== igualdade != diferença
x <- c(1,2,9,4,5)
y <- c(1,2,6,7,8)
x > y # Retorna TRUE para os maiores e FALSE para os menores
x >= y
x < y
x == y # Retorna TRUE para os x que são iguais a y
x != y # Retorna TRUE para os x que são diferentes de y
Agora vamos selecionar partes dos dados que obedecem a algum critério de seleção.
15
Tente prever o que ocorrerá usando o comando abaixo:
a[which(a>=14)]
Acertou? Selecionamos os valores de a que são maiores ou igual a que 14! Se errou, sem problemas -
tente rodar os comandos em partes, de dentro para fora, ou seja: primeiro, rode a>=14; depois,
which(a>=14); finalmente, a[which(a>=14)]. Em cada etapa, pare e pense sobre o que está sendo
feito. DICA: Sempre que encontrar comandos dentro de comandos, como neste caso, rode de dentro para
fora, para entender o que está sendo feito.
Também podemos usar a função which() para selecionar partes de uma tabela de dados. Por
exemplo, vamos selecionar apenas as parcelas dos dados de moluscos onde a chuva é maior que 1650
mm. Lembre-se que para selecionar partes de uma tabela podemos usar colchetes [linhas,colunas]
e especificar as linhas e colunas que desejamos usar. Vamos usar o comando which() para escolher
apenas as linhas (parcelas) onde a chuva é maior que 1650mm:
mol[which(mol$chuva>1650),]
Também podemos incluir um segundo critério de escolha usando & (que significa "e"). Vamos
escolher apenas as parcelas da reserva B e que tenham o valor de chuva maior que 1650mm:
mol[which(mol$reserva=="B" & mol$chuva>1650), ]
Também podemos usar o comando ifelse para transformar os dados em presença e ausência.
Vamos usar os dados das espécies de borrachudos (spp) da Chapada Diamantina:
ifelse(spp>=1, 1, 0) # se o valor for maior ou igual a 1 seja 1, se não, seja 0
2. Quais informações podem ser obtidas da tabela moluscos.txt quando usamos os quatro comandos
abaixo? Tente prever o resultado antes de rodar cada comando.
2.1. sum(mol[,2:7])
2.2. rowMeans(mol[1:5, 2:7])
2.3. colMeans(mol[1:5, 2:7])
2.4. mean(rowSums(mol[1:5, 2:7]))
3. a) Use a função t para transpor os dados de moluscos (apenas as espécies). b) Multiplique o valor da
abundância de cada espécie de molusco pelo valor de chuva da parcela correspondente. Por exemplo:
16
Na parcela 1 a chuva foi de 1800 mm e nesta parcela ocorreram 10 indivíduos da espécie 1, portanto
o novo valor para a sp1 na parcela 1 será de 1800 x 10 = 18000.
4. Faça um gráfico de pontos para comparar o número de macacos na reserva A com o número de
macacos na reserva B. Use o conjunto de dados macac. Use a função stripchart.
5. Importe para o R o arquivo “minhocas.txt”. Este arquivo possui dados sobre a densidade de minhocas
em 20 fazendas. As variáveis medidas são: área, inclinação do terreno, tipo de vegetação, pH do solo,
se o terreno é alagado ou não e a densidade de minhocas.
5.1. Veja a tabela na forma original e depois a ordene de acordo com o tamanho da área.
5.2. Faça um gráfico para ver a relação entre minhocas e área do terreno e outro gráfico para ver a
relação entre minhocas e tipo de vegetação.
5.3. Selecione a parte da tabela que contém apenas dados de locais alagados.
5.4. Calcule a densidade média de minhocas, e a densidade média em locais alagados e em locais
não alagados.
5.5. Qual a área média das fazendas?
Podemos usar a função ifelse() para transformar dados de abundância em dados de presença e
ausência. Transforme os dados de abundância de moluscos mol em dados de presença e ausência.
Com os dados transformados em presença e ausência, use a função rowSums para ver quantas espécies
de moluscos ocorrem em cada parcela. Use colSums para ver em quantas parcelas cada espécie
estava presente.
Salve o seu script e feche o RStudio. Ao fechar aparecerá um a pergunta sobre salvar ou não o
Workspace, diga que sim.
17
AULA 3 - GRÁFICOS
Como nas aulas anteriores, o primeiro passo é abrir o RStudio e criar um novo projeto:
- Clique em File > New Project > New Directory > New Project (ou “Empty Project”, dependendo
da versão do seu RStudio). Em “Directory name:”, coloque “Aula3”. Selecione em “Brownse” a pasta do
seu computador onde deseja salvar.
Crie um novo script, clicando no símbolo da folha em branco (logo abaixo de File) e selecionando R
Script. Como especificado no capítulo da Aula 2, digite todos os comandos nesse script, e não diretamente
no console do R.
O R é amplamente reconhecido por ter grande potencial para geração de gráficos de alta qualidade
e originalidade. Você pode fazer praticamente qualquer gráfico que imaginar. Os gráficos mais comuns
são os gráficos de barras, pizza e de dispersão (pontos).
NOTA: se a janela dos gráficos estiver dividida, digite par(mfrow=c(1,1)) para restaurá-la
18
3.4. GRÁFICO DE PONTOS – plot(x,y)
3.4.1. Gráficos com variáveis numéricas
Primeiro vamos inserir os dados de duas variáveis numéricas. Lembre-se que a forma mais simples
de inserir dados no R é usando a função de concatenar (combinar) dados c():
y <- c(110,120,90,70,50,80,40,40,50,30)
x <- 1:10
Apesar de não ser uma norma, colocar a variável resposta no eixo y (vertical) dos gráficos é um
consenso entre a maioria dos estatísticos, daí a letra y para dados resposta. x é chamada de variável
independente ou explicativa e aparece no eixo x (horizontal).
É muito simples fazer no R um gráfico de pontos de y contra x. A função utilizada é plot(), que
precisa de apenas dois argumentos: o primeiro é o nome da variável do eixo X, o segundo é o da variável
do eixo y:
plot(x,y)
Para usuários de outros programas que usam linha de comando, é comum trabalhar com a lógica
“plote y em função de x” de maneira que o primeiro argumento é sempre a variável resposta. Para isso,
você pode usar:
plot(y~x) # produz o mesmo resultado do comando anterior
A variável categórica é o fator sexo, e os dois níveis são "macho" e "fêmea". Em princípio, os níveis
do fator podem ser nomes ou números (“1” para macho e “2” para fêmea). Contudo, atente para o
seguinte: se for utilizado número sem as aspas, o programa R irá reconhecer essa variável como
numérica, e não como um nome. Embora isso possa ser corrigido, use nomes aqui para facilitar.
Vamos supor que estamos avaliando o peso de machos e fêmeas de uma dada espécie. Digamos
que, na nossa amostra, os 5 primeiros indivíduos eram machos e os últimos cinco eram fêmeas. Vamos
criar uma variável que indica isso:
Se fossem 20 machos e 20 fêmeas, seria muito trabalhoso digitar tudo. Para facilitar, tente recriar a
variável sexo com 5 “Ma” e 5 “Fe” usando o comando rep(x,vezes).
O peso dos animais será dado pelos valores do objeto y que criamos há pouco. Apenas indique isso:
peso <- y # peso é igual a y
peso
Observe que o comando não funcionou - deu erro! Isso ocorreu porque não informamos que sexo é um
fator. Vamos verificar o que o R acha que é a variável sexo:
class(sexo) # que tipo de objeto é sexo?
Veja que o R trata a variável sexo como um "vetor de caracteres". Mas nós sabemos que sexo é o
nosso fator, então precisamos dar esta informação ao R. A função factor(objeto) transforma o vetor
de caracteres em fator. O fator é um novo tipo de objeto, que ainda não tínhamos visto. É caracterizado
19
por um conjunto de dados categóricos ou nominais que podem assumir um número finito de níveis. Várias
funções do R requerem que as variáveis categóricas sejam apresentadas na forma de fator. Seguindo
adiante, vamos converter sexo em fator:
factor(sexo)
Gráficos do tipo boxplot são bons quando o número de observações (de dados) é muito grande.
Neste caso, um gráfico com pontos pode ser melhor, para mostrar ao leitor quantas observações foram
utilizadas para produzir o gráfico.
Para fazer um gráfico de pontos quando uma variável é categórica precisamos usar a função
stripchart(y~x):
stripchart(peso~sexo) # faz o gráfico, mas na horizontal
stripchart(peso~sexo, vertical=TRUE) # agora o gráfico está na vertical, porém os
pontos aparecem nas extremidades. TRUE pode ser abreviado para apenas T.
stripchart(peso~sexo, vertical=T, at=c(1.5, 2)) # agora os pontos estão
centralizados, pois com o argumento at, nós especificamos a localização dos pontos no
eixo X. Nota: caso os pontos não estejam centralizados, tente substituir c(1.5, 2) por
c(1.3, 1.7)
Note que agora só há um problema. Eram cinco fêmeas e no gráfico aparecem apenas quatro. Isso
ocorreu porque duas fêmeas têm o mesmo peso. Para melhorar o gráfico, é necessário usar o argumento
method="stack", para que os pontos não fiquem sobrepostos.
stripchart(peso~sexo, vertical=T, at=c(1.5, 2), method="stack")
Os pontos não estão mais totalmente sobrepostos, mas um símbolo ainda está sobre o outro. Usando
o argumento offset=valor conseguimos separá-los:
stripchart(peso~sexo, vertical=T, at=c(1.5, 2), method="stack", offset=1)
Você pode alterar a legenda do eixo y da mesma forma, porem usando ylab:
plot(x,y,xlab="Var explanatória",ylab="Var resposta")
Também é fácil mudar os símbolos do gráfico. Até aqui, estamos usando a opção default, que é a
"bolinha vazia" (pch=1). Se você deseja que o símbolo seja um "x", por exemplo, use pch=4:
plot(x,y,xlab="Var explanatória",ylab="Var resposta",pch=4)
20
plot(x,y,xlab="Var explanatória",ylab="Var resposta" ,pch=4, main="Título do
gráfico")
Há uma infinidade de parâmetros para serem alterados em gráficos. Use a função help -
help(barplot) e help(plot) - e veja quantas coisas você pode alterar em gráfico. No quadro abaixo,
relacionamos alguns parâmetros relativamente importantes para o uso cotidiano.
Vamos passar uma linha que passa pelo sétimo valor do eixo x e mudar a cor da linha:
abline(v=7,col="red") # pode escrever o nome da cor ou números (abaixo)
Há, no entanto, uma linha muito mais interessante e útil que podemos inserir num gráfico de pontos:
aquela que expressa a relação linear entre duas variáveis. No curso de estatística, aprendemos que a
equação da reta é y= a + bx. Assim, para produzir a linha no gráfico, basta informar quais os valores das
constantes a (intercepto) e b (inclinação).
Para extrair rapidamente essa informação (sem entrar em detalhes sobre regressão linear), nós
usamos a função lm(y~x), que significa linear model de y em função de x. Em seguida, fazemos o
gráfico e inserimos a linha informando as constantes:
lm(y~x)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
118.667 -9.212
21
abline(a=118.667,b=-9.212) # a = intercepto, b = inclinação
Agora que você já entendeu como o R faz para inserir a linha do modelo, você gostará de saber que
há uma maneira mais fácil e direta de inserir esta informação no gráfico:
Para adicionar estes pontos ao gráfico, basta usar a função points(). Assim como abline(), ela
também é inserida numa linha de comando em separado. Portanto, primeiro vamos refazer o gráfico com
x e y e depois adicionar os novos pontos usando uma cor diferente para diferenciar:
plot(x,y,pch=16, col="black")
points(v,w,pch=16, col="blue")
É possível adicionar pontos nos gráficos indicando com o mouse onde eles deverão ficar, usando
a função locator(n). O n indica o número de pontos que você deseja indicar no gráfico. A função
locator(n) permite que você clique no gráfico com o mouse e adicione o texto na posição desejada:
Agora vamos adicionar "seu nome" no gráfico nas coordenadas 6 e 7. Isso indica que seu nome
ficará na posição 6 do eixo X e na posição 7 do eixo Y.
text(6,7,"seu nome")
Também é possível adicionar texto aos gráficos usando a função locator(n). Para mais de um
texto:
plot(1:10,1:10)
text(locator(3),c("texto 1","texto 2","texto 3")) # clique em três locais do
gráfico para adicionar os textos
Agora vamos dividir a janela em duas linhas e duas colunas (para plotar 4 gráficos)
par(mfrow=c(2,2))
hist(rnorm(300,0,2),breaks=20,col=1)
hist(runif(300,0,2),breaks=20,col=1)
hist(rnorm(300,0,2),breaks=10)
hist(runif(300,0,2),breaks=10)
Lembre-se que, para restaurar a janela gráfica para o default (ou seja, para plotar apenas 1 gráfico em
toda a janela gráfica), digite par(mfrow=c(1,1)) ou dev.off().
Uma forma melhor é salvar os gráficos diretamente para o arquivo (pasta de trabalho), em formato
TIFF, PDF, JPEG, BMP, PNG ou outros formatos, com alta resolução (≥300 dpi), como solicitado por
muitas revistas científicas. Para tanto, você pode usar a função png(), entre outras. Vejamos um exemplo,
salvando em formato TIFF. Para funcionar, digite todos os três comandos abaixo, e depois veja o gráfico
na sua pasta de trabalho (FORA DO R – nenhum gráfico aparecerá dentro do R):
png("Fig1.tiff", width=8, height=8, units="cm", res=600)
plot(1:10,1:10)
dev.off()
O primeiro comando especifica o nome e tipo de gráfico; a largura e altura; e a resolução (no caso,
600 dpi). O segundo comando produz o gráfico. O terceiro comando informa ao R que o gráfico está
pronto e pode ser salvo na sua pasta de trabalho atual.
Os dados são:
sapos 6-5-10-11-26-16-17-37-18-21-22-15-24-25-29-31-32-13-39-40
umid 62-24-21-30-34-36-41-48-56-74-57-46-58-61-68-76-79-33-85-86
temp 31-23-28-30-15-16-24-27-18-10-17-13-25-22-34-12-29-35-26-19
2.1. Um colega coletou mais dados sobre aves e árvores, em outra área, que podemos aproveitar. Os
dados são:
aves2 <- c(7,15,12,14,4,14,16,20,13,16)
Inclua estes novos pontos no gráfico com um símbolo diferente e cor azul.
2.2. Junte o seu arquivo de aves com o arquivo de aves do seu amigo, para que fique em um arquivo
completo: aves.c <- c(aves,aves2). Faça o mesmo para árvores.
2.3. Os dados do exercício anterior foram coletados em regiões diferentes (você coletou no local A e
seu amigo no local B). Crie um novo objeto com os nomes dos locais onde cada coleta foi feita.
2.4. Faça um gráfico para ver qual região tem mais aves e outro para ver qual tem mais árvores.
Lembre-se que a região deve ser um fator, para que o gráfico seja feito. Use função stripchart.
2.5. Existem locais com o mesmo número de aves, e no gráfico estes pontos apareceram sobrepostos.
Faça o gráfico sem pontos sobrepostos (lembre-se dos argumentos method e offset)
Se sobrar tempo, brinque um pouco com seus gráficos, adicionando pontos, mudando cores e
símbolos, colocando nomes nos eixos etc. Tente também fazer gráficos com dados próprios, da sua
dissertação ou tese.
Existem diversos outros comandos para alterar a aparência de gráficos - veja por exemplo a página
do help da função par (?par). Não se preocupe se você ficar confuso sobre as opções desse help. Com
o tempo e com a prática, você irá dominar estes e outros comandos.
24
AULA 4 – FUNÇÕES E REPETIÇÕES (LOOPS)
Como nas aulas anteriores, o primeiro passo é abrir o RStudio e criar um novo projeto:
- Clique em File > New Project > New Directory > New Project (ou “Empty Project”, dependendo
da versão do seu RStudio). Em “Directory name:”, coloque “Aula4”. Selecione a pasta onde deseja salvar
no seu computador. Crie um novo script, clicando no símbolo da folha em branco (logo abaixo de File) e
selecionando R Script. Digite todos os comandos nesse script.
O R é extremamente útil para a análise de dados, mas sua principal vantagem é a possibilidade dada
aos usuários de criarem suas próprias funções, seja de simples manipulação de dados, seja de análise
estatística complexa. Além de ser um programa para análises estatísticas, o R é acima de tudo uma
linguagem de programação, praticamente ilimitada. Seus limites quase sempre serão dados pelos limites
de processamento do seu computador.
Dentro de function(), devemos listar todos os argumentos que a funçãoA terá. Eles serão usados
no corpo da função, que é a parte onde é escrito o "algoritmo", ou seja, os procedimentos ou comandos
a serem executados. Esta parte vem entre chaves. Veremos tudo isso em detalhes.
DICA DE PROGRAMAÇÃO!!
Embora não seja uma obrigação, é praxe entre programadores colocar a chave de abertura
da função “{“ no fim da primeira linha, e a chave de encerramento “}” numa linha separada após
o fim do corpo da função. Isso auxilia na leitura de linhas de programação quando elas são
muito extensas e possuem funções dentro de funções.
O comando que está dentro da nossa função, sample(x, n), indica que desejamos amostrar
valores de x, n vezes. No caso, x é um objeto representando a nossa moeda. Precisamos criar esse
objeto, antes de “jogá-lo”:
25
moeda <- c("Cara","Coroa")
Agora, podemos usar nossa função para jogar nossa moeda:
jogador(moeda,2)
jogador(moeda,10)
jogador(moeda,1000)
Veja que jogando 1000 moedas ficou difícil saber quantas caras e quantas coroas saíram. Lembra
como fizemos para conferir isso, na aula 1? Use a função table():
table(jogador(moeda,1000))
Agora, vamos usar nossa função jogador para arremessar um dado. Novamente, precisamos
primeiro criar um objeto que represente um dado. Como um dado tem seis valores possíveis, podemos
fazer o seguinte:
dado <- 1:6 # veja que “dado <- c(1,2,3,4,5,6)” produziria o mesmo resultado
Nossa função jogador é muito simples e nem é necessária, pois nós apenas imitamos uma função
que já existia no R, sample():
sample(c("cara","coroa"), 10, replace=T)
Agora suponha que você não sabe qual função do R calcula a média, mas você sabe a fórmula para
calcular média: soma dos valores, dividido pelo número de valores:
𝑆𝑜𝑚𝑎(𝑥)
𝑀é𝑑𝑖𝑎 =
𝑛
Conhecendo a fórmula, você pode criar sua própria função, para calcular a média de qualquer
conjunto de valores! Note que você pode inserir comentários dentro da função, para depois lembrar o
que fez:
media <- function(dados){ # função chamada media
soma <- sum(dados) # soma das observações
n <- length(dados) # n é o número de observações
med <- soma/n # calcula a média
return(med) # resultado final da função (no caso, o valor de med)
}# fim da função
Vamos usar essa nova função para calcular a média dos valores abaixo:
valores <- c(21, 23, 25, 19, 10,1 ,30, 20, 14, 13)
media(valores)
Para verificar se o cálculo foi feito corretamente, compare o resultado obtido com a função já pronta do
R:
mean(valores)
É possível criar funções para fazer conversões entre medidas. Por exemplo, em muitos filmes e
livros americanos é comum aparecer a temperatura em graus Fahrenheit (e.g. 60º F), enquanto no Brasil
estamos acostumados a graus Celsius. A fórmula para fazer a conversão é a seguinte:
𝑇𝑒𝑚𝑝𝐶𝑒𝑙𝑠𝑖𝑢𝑠 = (𝑇𝑒𝑚𝑝𝐹𝑎ℎ𝑟𝑒𝑛ℎ𝑒𝑖𝑡 − 32) ∗ (5/9)
Você consegue criar uma função para fazer essa conversão? Pense sozinho(a) primeiro, e tente criar
essa função. Uma possível resposta é apresentada a seguir:
fahrenheit_para_celsius <- function(temp_F) {
temp_C <- (temp_F - 32) * (5/9)
return(temp_C)
}
26
De forma similar, podemos criar funções para estimar alguns parâmetros ecológicos com base em
outros. Por exemplo, em mamíferos, a densidade populacional pode ser estimada a partir da massa
corporal média da espécie (Silva & Downing 1995. The allometric scaling of density and body mass: a
nonlinear relationship for terrestrial mammals. American Naturalist 145:704–727). Podemos criar uma
função que usa a massa corporal (em kg), para estimar a densidade (número de indivíduos por km2):
Densidade.Massa <- function(massa) {
log_10_dens <- 1.21 - 0.70*(log10(massa)) # Fórmula de Silva & Downing 1995
densidade <- 10^log_10_dens # anti-log – para que o resultado seja em n. indiv
return(densidade)
}
O comando for é usado para fazer loopings, isto é, repetir um mesmo procedimento inúmeras
vezes. Funciona da seguinte maneira:
for(i in 1:n){comandos}
Novamente: o que está em verde pode ser alterado por nós; o que está em azul, não – deve ser mantido
exatamente como está, para o R entender.
O comando acima quer dizer que, para cada valor i, variando de 1 até n, o R vai calcular os
comandos que estão entre as chaves. Para entender, precisamos de um exemplo. Vamos primeiro criar
um objeto vazio, para guardar os resultados que serão gerados pelo for:
resu <- numeric(0) # cria o objeto inicialmente vazio
resu
Agora vamos usar o for(){} para preencher esse objeto com valores. No caso, vamos preencher com
valores de 1 a 5, elevados ao quadrado:
for(i in 1:5){
resu[i] <- i^2
}
resu
Vamos fazer uma pausa para entender exatamente o que está acontecendo. O "(i in 1:5)" indica
que o símbolo i assumirá todos os valores no intervalo entre 1 e 5, sempre que ele aparecer em qualquer
parte de dentro da função. Ou seja, na primeira rodada do for, o i será substituído pelo número 1. Assim,
o R entenderá a linha de comando resu[i] <- i^2 como resu[1] <- 1^2. Em outras palavras,
na primeira posição do objeto resu (resu[1]), o R irá guardar o resultado de 1 elevado ao quadrado
(1^2). Depois, na segunda rodada do for, o i será substituído pelo número 2. Assim, o R entenderá a
linha de comando resu[i] <- i^2 como resu[2] <- 2^2. Em outras palavras, na segunda posição
do objeto resu (resu[2]), o R irá guardar o resultado de 2 elevado ao quadrado (2^2). E assim por
diante, até a 5ª rodada (já que mandamos o R ir de 1 a 5, ou seja, 1:5).
Entenda que o i dentro do for poderia ser qualquer outra letra ou palavra. Por exemplo, os comandos
abaixo produzem exatamente o mesmo resultado que os comandos acima:
for(BLABLA in 1:5){
resu[BLABLA] <- BLABLA^2
}
resu
Neste caso, trocamos o i por BLABLA; sempre que aparecer BLABLA dentro do for, o R entenderá
que deve trocá-lo por “algo”. Esse “algo”, no caso, é o número 1 na primeira rodada; 2 na segunda
rodada, etc., já que colocamos “1:5” dentro do for.
Da mesma forma, o “1:5” poderia ser outra coisa. O que aconteceria, por exemplo, se colocássemos
c(1,2), ao invés de 1:5? Pense primeiro, e depois teste no R!
27
Para deixar ainda mais claro, vamos fazer uma
espécie de "filminho" mostrando o que o for faz. Resumo sobre comando for(i in x)
Primeiro, vamos criar um gráfico vazio, apenas
plotando os eixos, indo de 0 a 10. Para tanto, vamos
• O loop for executa o mesmo
colocar o argumento type="n" para que os pontos
não apareçam: procedimento repetidamente para cada
valor que i assume.
plot(0:10, 0:10, type="n") • A linha de comandos que está dentro de
{ } precisa incluir o i como um dos seus
Agora, vamos usar o for para inserir textos
elementos em algum lugar
no gráfico. Um texto será colocado a cada passo
do for:
for(i in 1:9){
text(i, i, paste("Passo", i))
}
O R fez tudo muito rápido, de forma que não conseguimos ver o passo-a-passo do for. Vamos fazer
novamente, mas agora inserindo um comando que retarde o R em 1 segundo. Ou seja, cada passo irá
demorar 1 segundo:
plot(0:10, 0:10, type="n")
for(i in 1:9){
text(i, i, paste("Passo", i))
Sys.sleep(1)# retarda os passos em 1 segundo
}
Entendeu o que está sendo feito? No primeiro passo do for, o i foi substituído pelo número 1.
Portanto, a linha de comando text(i, i, paste("Passo", i)) virou text(1, 1,
paste("Passo", 1)). Como resultado, apareceu o texto "Passo 1", na coordenada x=1, y=1 do
gráfico. Note que a função paste() gera uma palavra ou frase, combinando os caracteres ou números
que nós incluímos dentro do parênteses. No segundo passo, o i foi substituído pelo número 2, portanto
apareceu o texto "Passo 2" na coordenada x=2, y=2, e assim por diante.
Fibonacci
[1] 1 1 2 3 5 8 13 21 34 55 89 144
Dedique o tempo que for necessário para entender o que está sendo feito. O for está sendo usado para
preencher o objeto Fibonacci. Os dois primeiros valores desse objeto são 1, 1, conforme nós indicamos
na linha acima (Fibonacci[c(1,2)] <- 1). Os valores 3 a 12 do objeto serão preenchidos pelo for.
Na primeira rodada do for, o símbolo n será substituído pelo número 3, então o R fará isto:
Fibonacci[3] <- Fibonacci[3-2] + Fibonacci[3-1]. Ou seja, na 3a posição
(Fibonacci[3]), o R colocará o resultado da soma entre o valor da 1a posição (Fibonacci[3-2], o
que equivale a Fibonacci[1]) e o valor da 2a posição (Fibonacci[3-1], o que equivale a
Fibonacci[2])). Releia tudo com calma; se necessário, pergunte aos professores.
28
4.3. EXERCÍCIOS - PARTE 1
1. Crie uma função e use-a para sortear seis números para jogar na mega sena. Lembre-se que: (i) os
números da mega sena variam de 1 a 60; um mesmo número não pode ser sorteado duas vezes.
2.4. modifique o código para que os valores sejam compostos pela diferença entre os dois valores
imediatamente anteriores somada ao terceiro valor imediatamente anterior. Para isto, faça
inicialmente com que a sequência Fibonacci já comece com 3 valores [1,1,1]. Cuidado aqui: se a
sequência inicial já tem 3 valores, será que ainda deveremos usar 3:12 dentro do for??
Agora vamos usar a função shannon para calcular o índice de Shannon para dados de uma
comunidade hipotética. Essa comunidade possui 5 espécies, com as abundâncias abaixo:
comunidade <- c(8,7,4,1,1)
shannon(comunidade)
Vamos testar seus conhecimentos ecológicos: o valor de shannon seria maior ou menor, se a comunidade
tivesse a mesma riqueza (5), mas abundâncias 1,1,1,1,1? E se tivesse apenas 4 espécies, com essas
mesmas abundâncias (1,1,1,1)? Por fim, a diversidade de Shannon seria diferente entre uma
comunidade com abundâncias (8,8,8,8,8) e outra com (100,100,100,100,100)? Você pode
conferir os resultados comparando com a função já pronta do R, diversity(). Para usar esta função,
você terá que instalar o pacote vegan, e depois carregá-lo no R:
29
install.packages("vegan") # é necessário ter conexão de internet!
library("vegan")
diversity(c(1,1,1,1))
shannon(c(1,1,1,1))
1. Crie uma função para calcular outro índice de diversidade, o índice de Simpson. A fórmula desse índice
é:
𝑆𝑖𝑚𝑝𝑠𝑜𝑛 = 1 − ∑𝑆𝑖 𝑃𝑖 2
Sendo Pi a abundância relativa de cada espécie. Aplique esse índice a uma comunidade com 10
espécies, com as seguintes abundâncias: 100, 88, 70, 40, 5, 5, 3, 1, 1, 1. Confira o resultado usando
a função diversity(dados, index = "simpson"), do pacote vegan, sendo “dados” o objeto
contendo a sua comunidade. (Nota: dependendo da versão, pode ser necessário usar index =
"simp" – veja no help da função diversity)
2. Modifique a função acima (Simpson) para calcular a diversidade em duas comunidades de uma única
vez. Ou seja, a função deve dar como resultado não apenas um valor, e sim dois (um por comunidade).
Primeiro, crie um dataframe para representar as duas comunidades, como abaixo:
comunidades
3. A função shannon criada ao longo da aula tem um problema: ela não funciona se alguma espécie da
comunidade tiver abundância = 0:
shannon(c(0,1,1))
[1] NaN
Isso ocorre porque aplicamos logaritmo em uma das etapas do cálculo (reveja a fórmula do índice), e
o log(0) não existe. Como você modificaria a função shannon, para que ela ignorasse as espécies
que têm abundância 0 e mesmo assim conseguisse calcular o valor de diversidade? Dica: a função
ifelse(), que vimos na segunda aula, pode ajudar.
4. Você é professor de Biologia e, chegando ao fim do semestre, precisa calcular as notas de seus alunos.
No entanto, suas avaliações tiveram peso diferente e o cálculo precisa ser de uma média ponderada. Os
dados estão na planilha “alunos.txt”. Cada linha corresponde a uma avaliação, a primeira coluna indica o
peso das avaliações e as demais colunas indicam o os nomes dos alunos. Crie uma função para calcular
a média ponderada de cada aluno. Quem é o melhor aluno da turma?
5. Crie uma função para converter coordenadas geográficas, de graus/minutos/segundos para graus
decimais. Por exemplo, a latitude da UERJ, em graus/minutos/segundos é 22° 54' 40" S. Para converter
para graus decimais, precisamos converter os minutos e os segundos em graus, e somar com os 22º.
Para tanto, basta lembrar que 60' = 1°, e 60" = 1'. Assim, no caso da UERJ, teríamos 22 + (54/60) +
(40/3600) = 22.91111 graus decimais. Depois que criar a função, aplique-a às seguintes coordenadas:
Nota: você terá que formatar esses dados e incluí-los no R, da forma que achar melhor – ex: vetores e
dataframes criados no R mesmo; planilha txt. Importada; arquivo Excel etc. Isso tudo faz parte do
exercício!
30