R para principiantes (mesmo)

Paulo Cesar de Paiva

DEPARTAMENTO DE ZOOLOGIA - INSTITUTO DE BIOLOGIA - UFRJ

Carlos Alberto de Moura Barboza

NUPEM - MACAÉ - UFRJ

Setembro de 2017


Abrindo o R pela primeira vez

Console e operações básicas

A primeira janela que vai abrir é o chamado console, neste são digitados todos os comandos e é onde saem os resultados. O console sempre começa com o sinal “>”. Portanto, após este sinal você vai digitar os comandos. No R é possível digitar diretamente no console ou usar um arquivo de texto, um script, que você deverá abrir em uma outra janela (ver no menu Arquivo > Abrir Script). Neste script você pode escrever e salvar todos os comandos e instruções que vamos ver a partir de agora. Os comandos podem ser copiados ou colados no console ou, de forma mais fácil, na janela do script usando o comando ctrl+R(Windows) ou command+return (Mac) no final da linha de comando. Este arquivo de texto (o script) você pode salvar e depois, quando você quiser fazer o mesmo procedimento (uma determinada análise, uma figura ou coisa parecida), carregar este arquivo e utilizar. Faça uma pasta de coleção dos seus scripts salvando com a extensão .txt ou usando o próprio editor do texto do R e salvando com a extensão .R.

A partir de agora, tudo que aparecer nas caixas sombreadas abaixo representam os comando do script que são transferidos para o console (a janela principal do R) e tudo o que estiver em caixas brancas é a saída (vulgo output), que vai aparecer apenas no seu console. Se você quiser salvar a saída você têm duas opções:

  • copiar e colar num editor de texto usando a fonte courier ou courier new ou

  • salvar o arquivo da área de trabalho no próprio R para carregar mais tarde (ver na janela superior do R)

Para começarmos vamos digitar coisas simples após o >:

1+2
## [1] 3
3*4
## [1] 12
3^2
## [1] 9

Note que, após o comando, é fornecido o resultado da operação simples que você fez: a soma de dois objetos (no caso os número 1 e 2), o produto de 3 e 4 e 3 elevado ao quadrado.

Entretanto os resultados não são armazenados na memória, para tanto você deve criar um objeto que tem o resultado. Por exemplo, o objeto minha.soma (nome que eu inventei) é:

minha.soma<-1+2

O objeto minha.soma foi armazenado na memória e, quando eu quiser carregá-lo, ele vai estar lá:

minha.soma
## [1] 3

Mas eu posso também fazer um objeto não numérico, desde que coloque ele entre aspas:

meu.apelido<-"Paulo Poliqueta"
meu.apelido
## [1] "Paulo Poliqueta"

Existem vários tipos de objetos, os resultados numéricos das operações ou o meu apelido são ambos objetos escalares. Outros tipos de objetos mais utilizados são, por exemplo, os vetores e matrizes. Um vetor é uma sequência de números ou caracteres (nomes). Para fazer um você cria um nome e acrescenta uma flecha <-. Do lado direito da flecha você vai dar um comando - neste caso o comando é c que significa “concatenar” - com a sequência de números entre parênteses e separados por vírgulas. Exemplos de vetores são:

meu.vetor<-c(1,2,4,2,5)
meu.vetor2<-c(10,20,30,21,32)
meus.animais<-c("Boi", "Peixe", "Elefante", "Mosca", "Poliqueta")
meu.vetor
## [1] 1 2 4 2 5
meu.vetor2
## [1] 10 20 30 21 32
meus.animais
## [1] "Boi"       "Peixe"     "Elefante"  "Mosca"     "Poliqueta"

Se você tivesse digitado “Meus.animais” teria uma mensagem de erro, isso ocorre pois objetos com letras maiúsculas ou minúsculas não são os mesmos, por isso tome cuidado ao digitar. O vetor meu.vetor é um vetor de números, ou numérico, enquanto que o vetor meus.animais é um vetor de caracteres. Você pode checar qual o tipo do seu vetor e se está tudo correto com o comando:

mode(meu.vetor)
## [1] "numeric"
mode(meus.animais)
## [1] "character"

Matrizes e Data Frames

As matrizes são formadas por vários vetores numéricos enquanto que os data frames permitem vetores (na forma de colunas) numéricos e caracteres. Veja os exemplos abaixo:

minha.matriz<-cbind(meu.vetor, meu.vetor2)
minha.matriz
##      meu.vetor meu.vetor2
## [1,]         1         10
## [2,]         2         20
## [3,]         4         30
## [4,]         2         21
## [5,]         5         32

Note que a matriz agora é formada pelos dois vetores e as linhas são numeradas. É importante observar a notação [1,] os colchetes indicam a posição dos dados na matriz, sendo antes da vírgula a linha - neste caso é a primeira linha da matriz - e, depois da vírgula, a coluna. No resultado após a vírgula não há número algum, indicando que se refere aos dados de todas as colunas daquela linha 1. O elemento [3,1] da minha.matriz, por exemplo é o dado ou número da linha 3 e da coluna 1, como você pode comprovar:

minha.matriz[3,1]
## meu.vetor 
##         4

De outra forma se você chamar [,2], você vai obter todos os elemento da coluna 2, pois você definiu a coluna (o número 2 depois da vírgula, mas deixou a linha em branco, não definiu nenhum elemento antes da vírgula):

minha.matriz[,2]
## [1] 10 20 30 21 32

Já no data.frame temos também vetores de caracteres como no caso:

meu.data.frame<-as.data.frame(cbind(meu.vetor, meu.vetor2, meus.animais))
meu.data.frame
##   meu.vetor meu.vetor2 meus.animais
## 1         1         10          Boi
## 2         2         20        Peixe
## 3         4         30     Elefante
## 4         2         21        Mosca
## 5         5         32    Poliqueta

Note que, antes de juntar os vetores, foi efetuado o comando as.data.frame para converter a matriz criada em um data frame. Podemos checar se está tudo correto com o comando class, que mostra a que classe pertence o objeto entre parênteses (se é uma matriz, um vetor, um data frame, etc.)

class(minha.matriz)
## [1] "matrix"
class(meu.data.frame)
## [1] "data.frame"

Operações simples

Vamos ver algumas operações simples como, por exemplo, qual a soma dos valores do meu.vetor (a coluna 1 do meu objeto meu.data.frame) e qual a média dos valores do meu.vetor2 (a coluna 2)

sum(meu.vetor)
## [1] 14
mean(meu.vetor2)
## [1] 22.6

Todas estes objetos: vetores, matizes, data.frames resultados de funções, etc. ficam no workspace ou seja no espaço virtual de trabalho. Estes podem ser salvos no seu computador, caso contrário, quando você fecha a seção todos eles são apagados. Se você quiser saber o que está no espaço virtual, basta listar os objetos:

ls()
## [1] "meu.apelido"    "meu.data.frame" "meu.vetor"      "meu.vetor2"    
## [5] "meus.animais"   "minha.matriz"   "minha.soma"

Caso você queira apagar ou remover algum objeto do workspace , basta digitar:

rm(meu.vetor2)
ls()
## [1] "meu.apelido"    "meu.data.frame" "meu.vetor"      "meus.animais"  
## [5] "minha.matriz"   "minha.soma"

Note que o objeto meu.vetor2 não está mais no espaço virtual.

Na hora de fechar o R uma janela será aberta perguntando se você quer salvar o workspace, ou se você preferir, pode salvar ele de tempos em tempos fornecendo um nome para o arquivo (com a extensão •RData*)

r save.image("meus.dados.RData")

Importando dados externos

Na maioria das vezes você já tem seus dados devidamente preenchidos na forma de uma planilha eletrônica (Excel, Numbers, Calc, etc.). Nestes casos, ao invés de digitar tudo de novo, o ideal é importar os dados para dentro do ambiente de trabalho do R. Para que esta importação possa ocorrer você deve salvar o seu arquivo de Excel na extensão csv ou txt. Mas, para que seu arquivo seja lido, através do comando read, é necessário que ele esteja na mesma pasta onde o R está trabalhando. Está pasta pode ser definida no menu, Arquivo > Alterar o dir. (Windows) ou Change working directory (Mac).

As planilhas do Excel devem ser simples, e começar sempre na primeira linha e primeira coluna. Na primeira linha deve constar os nomes das variáveis enquanto, nas demais, devem estar os dados, números ou caracteres. Os nomes da primeira linha não devem ter pontos ou vírgulas. Esta forma de matriz é o padrão para o R, variáveis sempre são colunas, observações são linhas. Por exemplo, caso você tenha dois grupos de dados: o comprimento da espécie A em uma coluna e de B na outra, você deverá colocar os comprimentos de ambas as espécies na mesma coluna. Vamos chamar esta coluna Comprimento, e criaremos uma nova coluna com a variável Espécie onde colocando um código para cada espécie, ou seja uma variável de caracteres que, neste caso é um fator.

Forma errada

##   EspecieA EspecieB
## 1     12.3     11.2
## 2     13.4     10.7
## 3     10.1      9.3
## 4     17.4     12.2
## 5     11.4      8.9

Forma correta

##    Especie Comprimento
## 1     EspA        12.3
## 2     EspA        13.4
## 3     EspA        10.1
## 4     EspA        17.4
## 5     EspA        11.4
## 6     EspB        11.2
## 7     EspB        10.7
## 8     EspB         9.3
## 9     EspB        12.2
## 10    EspB         8.9

Mais detalhes veremos abaixo quando trabalharmos com uma planilha pronta.

Após mudar o diretório você pode fazer a leitura e dar o nome que você quiser. Suponhamos que o nome original salvo no Excel fosse arquivo.csv ou arquivo.txt:

meu.novo.arquivo1<-read.csv("arquivo.csv")
meu.novo.arquivo2<-read.table("arquivo.txt", dec=",")

Provavelmente você vai receber uma mensagem de erro no primeiro caso (csv), isso ocorre por que o Excel em português usa vírgulas como decimais (além de separar as colunas com ponto e vírgula ao invés da vírgula utilizada na versão em inglês). Então vamos usar outra forma, usando o comando read.csv2. Observe que, para o arquivo txt esta informação foi fornecida através do comando dec=“,”)

meu.novo.arquivo1<-read.csv2("arquivo.csv")

Caso você tenha dificuldade ou não queira mudar o diretório de trabalho do R você pode simplesmente buscar o arquivo em outro diretório sem alterar o diretório de trabalho do R. Após o comando abaixo, vai ser aberta uma janela onde você pode procurar o arquivo nos diretórios do seu computador.

meu.novo.arquivo1<-read.csv2(file.choose())

Após importar o arquivo você vê-lo digitando no console o nome ou, se o arquivo for muito grande, apenas as primeiras linhas usando o comando head (=cabeça).

meu.novo.arquivo1
##      A   B
## 1  1.8 1.3
## 2  4.8 4.3
## 3  7.5 7.0
## 4  3.0 2.1
## 5  1.5 1.0
## 6  2.5 2.0
## 7  4.0 3.0
## 8  4.5 4.0
## 9  5.0 4.3
## 10 6.0 5.2
## 11 5.6 5.1
head(meu.novo.arquivo1)
##     A   B
## 1 1.8 1.3
## 2 4.8 4.3
## 3 7.5 7.0
## 4 3.0 2.1
## 5 1.5 1.0
## 6 2.5 2.0

Trabalhando com pacotes

Instalando e carregando um pacote

Quando você baixa o R em seu computador ele já tem uma série de pacotes que são carregados automaticamente. Entretanto, para muitas análises é necessário baixar e instalar alguns pacotes. Isto pode ser feito no menu (Pacotes > Instalar Pacote(s) ou Package Installer) ou através de comando de linha:

install.packages("CARS")
install.packages("MASS")

Cada pacote é utilizado para análises específicas, entretanto, para estatística do dia a dia, ou mesmo para algumas análises mais complexas os pacotes básicos carregados automaticamente quando você abre o R já são suficientes. Para não sobrecarregar demais a memória do computador os pacotes ficam guardados e você carrega eles apenas quando for utilizar:

library("CARS")
library("MASS")

Estatística básica

Estatística descritiva

Para iniciarmos as análises vamos utilizar uma série de dados (datasets) de um dos pacotes que já carregamos (MASS). Este dataset denominado crabs é composto de uma série de medidas morfométricas tomadas em duas espécies de caranguejos

head(crabs)
##   sp sex index   FL  RW   CL   CW  BD
## 1  B   M     1  8.1 6.7 16.1 19.0 7.0
## 2  B   M     2  8.8 7.7 18.1 20.8 7.4
## 3  B   M     3  9.2 7.8 19.0 22.4 7.7
## 4  B   M     4  9.6 7.9 20.1 23.1 8.2
## 5  B   M     5  9.8 8.0 20.3 23.0 8.2
## 6  B   M     6 10.8 9.0 23.0 26.5 9.8

Para se ter uma ideia da estrutura deste data frame, isto é, quais e quantas são variáveis, que tipo de variáveis e quantos níveis em cada variável (ex. os níveis da variável sex são: M e F, isto é machos e fêmeas) você deve digitar:

str(crabs)
## 'data.frame':    200 obs. of  8 variables:
##  $ sp   : Factor w/ 2 levels "B","O": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex  : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ index: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ FL   : num  8.1 8.8 9.2 9.6 9.8 10.8 11.1 11.6 11.8 11.8 ...
##  $ RW   : num  6.7 7.7 7.8 7.9 8 9 9.9 9.1 9.6 10.5 ...
##  $ CL   : num  16.1 18.1 19 20.1 20.3 23 23.8 24.5 24.2 25.2 ...
##  $ CW   : num  19 20.8 22.4 23.1 23 26.5 27.1 28.4 27.8 29.3 ...
##  $ BD   : num  7 7.4 7.7 8.2 8.2 9.8 9.8 10.4 9.7 10.3 ...

Você pode trabalhar com as variáveis que quiser do data frame, não é necessário trabalhar com tudo. Para fazer análises ou gráficos com estes dados existem várias formas, aqui vamos falar de três principais:

  1. Carregando o data frame, assim toda vez que você for usar uma variável ela já vai estar disponível sem precisar dizer a que data frame ela pertence:
attach(crabs)
  1. Outra forma é, toda vez que for usar uma variável, chamá-la pelo seu, por assim dizer, “nome completo” dizendo qual o data frame e qual é a variável. Isto é feito juntando o nome do data frame com o da variável separados por um cifrão.
crabs$FL
  1. Alguns pacotes e comandos permitem que você informe a qual data frame se refere dentro do próprio comando:
plot(FL~CW, data=crabs)

Média, Variância e Desvio Padrão

Vamos ver alguns parâmetros estatísticos básicos, salvando eles como objetos criados por nós:

media<-mean(crabs$FL)
variancia<-var(crabs$FL)
desvio<-sd(crabs$FL)

media
## [1] 15.583
variancia
## [1] 12.2173
desvio
## [1] 3.495325

Conhecendo a fórmula da média e da variância você mesmo pode fazer a equação

minha.media<-sum(crabs$FL)/length(crabs$FL)
minha.var<-sqrt(sum((crabs$FL-minha.media)^2)/(length(crabs$FL)-1))

Onde a função pré-definida pelo R sum é a soma e length é o comprimento do vetor, isto é, o número de observações

Você também pode criar sua própria função para calcular a média usando o comando function do R. Esta função pode ser chamada a qualquer momento e ser aplicada a qualquer vetor ou variável:

minha.func.media<-function(x){
     sum<-sum(x)
     n<-length(x)
     valor<-sum/n
 return(valor)
} 

E aplicar nos seu dados:

minha.func.media(crabs$FL)
## [1] 15.583

No caso acima a função foi aplicada a uma única variável (no caso crabs$FL), mas as funções podem envolver diversas variáveis. Vamos construir então, por exemplo, uma com duas variáveis - vendo qual a razão entre o comprimento (CL) e a largura da carapaça(CW) dos caranguejos:

minha.func.razao<-function(x,y){
    sum1<-sum(x)
     n<-length(x)
     valor1<-sum1/n
     sum2<-sum(y)
     valor2<-sum2/n
     razao<-valor1/valor2
 return(razao)
} 

Neste caso aplicamos a função a duas variáveis:

minha.func.razao(crabs$CL, crabs$CW)
## [1] 0.881668

Vamos agora estudar um pouco as variáveis em questão para que possamos analisá-las. Como o data frame crabs pertence a um pacote, vamos ver do que se trata usando o help através de uma interrogação antes do nome:

?crabs

Na janela que se abre é explicado do que se trata o dataset e o que significa cada uma das variáveis dos caranguejos estudados. Eventualmente você está interessado apenas em parte deste data frame. Por exemplo, os caranguejos medidos correspondem a duas espécies (variável sp) e foram separados em sexo (variável sex). Suponhamos que você queira trabalhar apenas com os machos, neste caso você pode isolar apenas os machos através do comando subset da seguinte forma:

crabs.machos<-subset(crabs, sex=="M")
str(crabs.machos)
## 'data.frame':    100 obs. of  8 variables:
##  $ sp   : Factor w/ 2 levels "B","O": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex  : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ index: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ FL   : num  8.1 8.8 9.2 9.6 9.8 10.8 11.1 11.6 11.8 11.8 ...
##  $ RW   : num  6.7 7.7 7.8 7.9 8 9 9.9 9.1 9.6 10.5 ...
##  $ CL   : num  16.1 18.1 19 20.1 20.3 23 23.8 24.5 24.2 25.2 ...
##  $ CW   : num  19 20.8 22.4 23.1 23 26.5 27.1 28.4 27.8 29.3 ...
##  $ BD   : num  7 7.4 7.7 8.2 8.2 9.8 9.8 10.4 9.7 10.3 ...

No comando subset note que eu selecionei o data frame original (crabs) e qual o critério para tirar esta amostra (sex==“M”). O uso == para especificar igualdade é necessário pois o símbolo =, para o R, é um operador matemático). Observe que este novo data frame (crabs.machos) tem apenas 100 observações (linhas), enquanto que o crabs tinha 200.

Bom, mas agora voltar a trabalhar com o data frame completo.