Marcos V. C. Vital e participantes da turma de 2014
Para mais material, acesse http://marcosvital.wordpress.com/
Este documento nasceu durante as atividades do “Curso de introdução ao uso do software R e suas aplicações estatísticas nas ciências biológicas”, realizado no IPÊ em dezembro de 2014. Ele resume a maior parte das atividades que realizamos durante o curso, e esperamos que seja útil como um guia para se aprender algumas das funcionalidades do R. Neste primeiro guia apresentaremos os fundamentos mais básicos do R, e iremos aprender a importar e realizar algumas manipulações básicas dos dados. Outros guias serão produzidos na medida em que o curso avançar, então dê uma conferida no restante do material!
Todo o documento foi criado utilizando o software R, o programa RStudio e a linguagem Markdown. Para saber mais, acesse:
Vá reproduzindo os comandos de exemplo abaixo, e observe os resultados no R.
O R como calculadora:
2+5 #Soma
30*7 #Multiplicação
10/2 #Divisão
50-90 #Subtração
10^2 #Potência
sqrt(4) #Raiz quadrada
log(100,10) #Log na base 10
Resumindo:
+, -, / e *
Fazem as operações básicas^
é o símbolo de potênciasqrt()
é uma função que calcula raiz quadradalog()
calcula um logarítmo em uma base da minha escolhaComo criar um objeto:
objeto<-10 #Criando
objeto #"Chamando" o objeto no R
objeto*10 #Multiplica por 10, mas não salva o resultado
objeto #Veja como ele continua igual
objeto<-objeto*10 #Agora sim, salva o resultado da operação
objeto #Agora sim ele salvou a modificação
Usando o sistema de ajuda!
Quando eu já conheço a função, basta usar: ?função
Por exemplo:
?log
#ou:
help(log) #Que na verdade faz a mesma coisa
E o que fazer quando não sei o nome da função?!
??anova
#Quando precisamos buscar termos com mais de uma palavra:
help.search("linear regression")
E se a busca falhar, vamos para a internet!
http://r-br.2285057.n4.nabble.com/
http://stackoverflow.com/
https://stat.ethz.ch/mailman/listinfo/r-sig-ecology
http://www.r-bloggers.com/
https://www.coursera.org/
https://www.coursera.org/course/compdata
https://class.stanford.edu/
A importação de um conjunto de dados pode ser feito por vários métodos diferentes no R, e muitas vezes a escolha de um método ou outro depende, no fundo, mais de escolhas pessoais do que das características destes métodos. Aqui nós vamos usar a função read.table()
.
Os passos fundamentais para a importação são:
setwd()
dir()
read.table
header=T
se os dados tiverem cabeçalho (e aposto que eles tem!)attach()
para que o R reconheça os nomes das variáveis da sua tabela.summary()
e str()
attach()
pode ser revertido com um detach()
quando você for mudar o conjunto de dados analisados.Vejamos um exemplo:
setwd("C:/R/Curso IPÊ")
dir()
## [1] "0 - Script básico IPE 2014.R"
## [2] "1 - Script de ler e manipular dados IPE 2014.R"
## [3] "10 - Script de NMDS, adonis e envfit.R"
## [4] "2 - Script de testes de significância IPE 2014.R"
## [5] "3 - Script de ANOVA IPE 2014.R"
## [6] "4 - Script de regressão IPE 2014.R"
## [7] "5 - Script de cluster IPE 2014.R"
## [8] "6 - Script de PCA IPE 2014.R"
## [9] "7 - Script de Mantel IPE 2014.R"
## [10] "8 - Script de SIG IPE 2014.R"
## [11] "9 - Script de regressão múltipla IPE 2014.R"
## [12] "adubos.txt"
## [13] "bradypus.csv"
## [14] "Brincando de SIG.txt"
## [15] "coldiss.R"
## [16] "cultivo.txt"
## [17] "Dados para o curso.xls"
## [18] "dados1.txt"
## [19] "dados2.txt"
## [20] "dados3.txt"
## [21] "dados4.txt"
## [22] "DensPraga.txt"
## [23] "fumo.txt"
## [24] "grande.txt"
## [25] "insetos.txt"
## [26] "Insetos.xlsx"
## [27] "latitude.txt"
## [28] "média.txt"
## [29] "Nova pasta"
## [30] "peixes.txt"
## [31] "pequena.txt"
## [32] "pratica1.txt"
## [33] "Script de NMDS, procrustes e envfit.R"
## [34] "Script em Markdown dia 1.Rmd"
## [35] "Script para função pairs.R"
## [36] "Script_em_Markdown_dia_1.html"
## [37] "Script_em_Markdown_dia_1.Rmd"
## [38] "Script_em_Markdown_dia_2.html"
## [39] "Script_em_Markdown_dia_2.Rmd"
## [40] "Script_em_Markdown_dia_3.html"
## [41] "Script_em_Markdown_dia_3.Rmd"
## [42] "Script_em_Markdown_dia_3_2.html"
## [43] "Script_em_Markdown_dia_3_2.Rmd"
## [44] "Script_em_Markdown_dia_4_1_Cluster.html"
## [45] "Script_em_Markdown_dia_4_1_Cluster.Rmd"
## [46] "Script_em_Markdown_dia_4_2_PCA.html"
## [47] "Script_em_Markdown_dia_4_2_PCA.Rmd"
## [48] "Script_em_Markdown_dia_4_3_Mantel.html"
## [49] "Script_em_Markdown_dia_4_3_Mantel.Rmd"
## [50] "Script_em_Markdown_dia_5_1_SIG.html"
## [51] "Script_em_Markdown_dia_5_1_SIG.Rmd"
## [52] "Script_em_Markdown_dia_5_2_reg_multipla.html"
## [53] "Script_em_Markdown_dia_5_2_reg_multipla.Rmd"
## [54] "Script_em_Markdown_dia_5_3_NMDS.html"
## [55] "Script_em_Markdown_dia_5_3_NMDS.Rmd"
## [56] "Todos os documentos em Markdown - Curso do R no IPÊ 2014.zip"
## [57] "Todos os scripts - Curso do R no IPÊ 2014.zip"
## [58] "Todos os scripts para os doc em Markdown - R no IPÊ 2014.zip"
dados<-read.table("pratica1.txt", h=T)
attach(dados)
summary(dados)
## UA Ambiente Área Riqueza
## Min. : 1.00 primário :22 Min. : 40.0 Min. :14.00
## 1st Qu.:13.25 secundário:28 1st Qu.: 79.5 1st Qu.:23.00
## Median :25.50 Median :102.5 Median :29.50
## Mean :25.50 Mean :102.5 Mean :29.22
## 3rd Qu.:37.75 3rd Qu.:127.8 3rd Qu.:35.00
## Max. :50.00 Max. :167.0 Max. :48.00
## Abund_sp1
## Min. :0.00
## 1st Qu.:1.00
## Median :2.00
## Mean :2.16
## 3rd Qu.:3.00
## Max. :8.00
O R é um ambiente fantástico para se explorar dados, realizar filtragens e alterações, criar novas variáveis e outras coisas do tipo sem ter que voltar à planilha de dados original e sem ter que fazer um monte de tarefas repetitivas.
Nós vamos, então, brincar um pouco com a planilha de dados importada acima, com o objetivo de ter contato com estas funcionalidades.
Acessando partes dos dados
Uma das coisas que o R permite com facilidade é acessar qualquer “pedaço” da sua planilha de dados. Isto pode ser feito fazendo-se referência às linhas e/ou colunas que compõem a nossa planilha. A estrutura básica da coisa é sempre assim: `dados[linhas, colunas]´.
Veja e reproduza os exemplos a seguir para compreender melhor:
dados[2,3] #Segunda linha, terceira coluna
dados[5,] #Todos os dados da linha 5
dados[,3] #Todos os dados da coluna 3
dados[10:20, 3:5] #Colunas 3 a 5, linhas 10 a 20
dados[, c(3,5)] #Apenas colunas 3 e 5, sem a coluna 4
Filtrando e selecionando dados de acordo com uma ou mais variáveis
O R permite que os dados sejam manipulados a partir de condições criadas pelas próprias variáveis. Veja e execute alguns dos exemplos a seguir para compreender como funciona:
#Vendo os dados de riqueza apenas para as unidades amostrais de ambiente primário:
Riqueza[Ambiente=="primário"]
#Vendo os dados de riqueza apenas paras as unidades com área maior ou igual a 120:
Riqueza[Área>=120] #Riqueza quando a área é maior ou igual a 120
#Combinando duas condições com o símbolo "&"
#Neste caso estamos vendo os dados de riqueza para ambientes secundários e que possuem
#pelo menos um indivíduo da espécie 1 (ou seja, quando Abund_sp1 é maior do que zero):
Riqueza[Ambiente=="secundário" & Abund_sp1>0] #Combinando condições
#Usando uma ou outra condição; o símbolo "|" significa "ou";
#Aqui estamos vendo a riqueza nos ambientes secundários ou que possuem área menor do que 100:
Riqueza[Ambiente=="secundário" | Área<100] #"|" significa "ou"
Criando novas variáveis e agregando-as aos nosso dados
No R é bem fácil criar e agregar novas variáveis aos dados sem termos que voltar à planilha original. Na verdade, podemos até mesmo criar uma nova planilha para substituir a anterior com a função write.table()
!
Vamos começar criando uma nova coluna, na qual vamos inserir os dados de riqueza transformados por logarítmo:
riq.log<-log10(Riqueza) #Criei um novo objeto
dados<-cbind(dados, riq.log) #Acrescentei o novo objeto nos dados, como uma nova coluna!
summary(dados) #Conferindo se os dados foram atualizados:
## UA Ambiente Área Riqueza
## Min. : 1.00 primário :22 Min. : 40.0 Min. :14.00
## 1st Qu.:13.25 secundário:28 1st Qu.: 79.5 1st Qu.:23.00
## Median :25.50 Median :102.5 Median :29.50
## Mean :25.50 Mean :102.5 Mean :29.22
## 3rd Qu.:37.75 3rd Qu.:127.8 3rd Qu.:35.00
## Max. :50.00 Max. :167.0 Max. :48.00
## Abund_sp1 riq.log
## Min. :0.00 Min. :1.146
## 1st Qu.:1.00 1st Qu.:1.362
## Median :2.00 Median :1.469
## Mean :2.16 Mean :1.449
## 3rd Qu.:3.00 3rd Qu.:1.544
## Max. :8.00 Max. :1.681
#Se quiser, eu também posso remover o objeto criado, para evitar que um objeto e uma variável
#com o mesmo nome fiquem convivendo. Então vamos lá:
rm(riq.log) #Removi o objeto criado acima (mas não mexi na coluna nova, ok?)
detach(dados) #Desfiz o attach() feito la atrás, pois a nossa planilha ganhou uma coluna
attach(dados) #Refiz o attach() para que a nova coluna possa então ser reconhecida!
Aqui vimos algumas funções novas, e convém descrevê-las:
cbind()
serve para “costurar” novas colunas a um banco de dados, ou combinar bancos de dados lado a ladorm()
serve par remover objetos da memória do Rdetach()
serve para desfazer um attach()
Agora vamos criar mais uma variável. Mas desta vez não será uma simples transformação. Imagine que você deseja classificar os fragmentos em três classes de tamanho (pequenos, médios e grandes), a partir da área total de cada um deles. O seu critério de classificação é: áreas menores do que 90 são pequenas; áreas maiores ou iguais a isso, mas menores do que 120 são grandes; e áreas maiores ou iguais a 120 são grandes.
Vamos lá:
área.cat<-ifelse(Área<90,"pequena", ifelse(Área>=120, "grande", "média"))
área.cat
## [1] "média" "média" "grande" "média" "pequena" "pequena" "grande"
## [8] "grande" "grande" "média" "pequena" "grande" "grande" "pequena"
## [15] "média" "pequena" "média" "pequena" "pequena" "grande" "média"
## [22] "pequena" "grande" "média" "pequena" "pequena" "média" "grande"
## [29] "grande" "grande" "grande" "média" "pequena" "pequena" "média"
## [36] "pequena" "grande" "grande" "grande" "pequena" "pequena" "média"
## [43] "média" "média" "grande" "pequena" "pequena" "pequena" "grande"
## [50] "média"
dados<-cbind(dados, área.cat)
summary(dados)
## UA Ambiente Área Riqueza
## Min. : 1.00 primário :22 Min. : 40.0 Min. :14.00
## 1st Qu.:13.25 secundário:28 1st Qu.: 79.5 1st Qu.:23.00
## Median :25.50 Median :102.5 Median :29.50
## Mean :25.50 Mean :102.5 Mean :29.22
## 3rd Qu.:37.75 3rd Qu.:127.8 3rd Qu.:35.00
## Max. :50.00 Max. :167.0 Max. :48.00
## Abund_sp1 riq.log área.cat
## Min. :0.00 Min. :1.146 grande :17
## 1st Qu.:1.00 1st Qu.:1.362 média :15
## Median :2.00 Median :1.469 pequena:18
## Mean :2.16 Mean :1.449
## 3rd Qu.:3.00 3rd Qu.:1.544
## Max. :8.00 Max. :1.681
Aqui usamos a função ifelse()
, que executa uma ação a partir de uma condição criada por mim. Note que para obtermos o nosso resultado usamos uma ifelse()
dentro da outra!
De novo é legal eliminarmos o objeto, já que ele foi incorporado na nossa tabela:
detach(dados)
rm(área.cat)
attach(dados)
E agora, apenas para ilustrar mais funcionalidades úteis do R, imagine que você quer fazer duas coisas: dividir o seu banco de dados em pedaços de acordo com aquela variável categórica que criamos (ou seja, de acordo com as classes de tamanho) e, depois, salvar cada nova tabela em um arquivo. Vamos fazer isto em duas etapas:
split()
dados.divididos$classe
para acessar cada pedaço por seu nome; ou chamar dados.divididos[[1]]
para acessar pela ordem.write.table()
Vamos lá:
dados.divididos<-split(dados, área.cat) #Fazendo a divisão
# E agora Salvando tudo em arquivos separados, manualmente:
write.table(dados.divididos$pequena, "pequena.txt")
write.table(dados.divididos$média, "média.txt")
write.table(dados.divididos$grande, "grande.txt")
Como refazer esta última etapa de maneira automática?!
Ah, sim, você pode estar com preguiça com vontade de ver o verdadeiro potencial do R, e uma boa maneira de fazer isso é tentar automatizar ações que são apenas pequenas variações da mesma coisa. No caso acima, por exemplo, nós escrevemos o comando write.table três vezes, mudando apenas a parte do objeto e o nome do arquivo a serem salvos. Será que eu consigo fazer o R entender o que eu pretendo, e fazer tudo de uma vez sem precisar repetir o comando? Mais do que isso: será que eu consigo criar um comando que faça isso de maneira automática, salvando arquivos a partir de qualquer variável categórica e criando um arquivo por classe?
A resposta é sim! Então vejamos uma maneira de fazer isso. Vamos usar um loop, que é chamado pela função for()
:
for (i in 1:nlevels(área.cat)) {
write.table(dados.divididos[[i]], paste(levels(área.cat)[i], ".txt", sep=""))
}
Neste loop, a única coisa que precisa ser substituída caso você utilize outro conjunto de dados é o nome da variável categórica, que no nosso exemplo é area.cat.
Legal, né? :D