R para principiantes (mesmo)
Paulo Cesar de Paiva
DEPARTAMENTO DE ZOOLOGIA - INSTITUTO DE BIOLOGIA - UFRJ
Carlos Alberto de Moura Barboza
NUPEM - MACAÉ - UFRJ
Maio de 2020
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, matrizes, ‘data frames’(=planilhas) e listas. 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 recebido 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"
As matrizes são formadas por vários vetores numéricos enquanto que os data frames (aqui vamos usar o termo em inglês, mas ele pode ser traduzido como planilha) permitem vetores (na forma de colunas) tanto numéricos como 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
O comando cbind signfica literalmente “colar colunas”, ou seja, você está colando um vetor do lado do outro como colunas. Se você quisesse que eles fossem colados um em cima do outro como linhas o comando seria rbind. Tente fazer isso depois e olhe o resultado.
Note que a matriz agora é formada pelos dois vetores e as linhas são numeradas. É importante observar este tipo notação entre colchetes: [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
Desta forma você pode, não apenas localizar um valor mas também alterá-lo caso necessário. Por exemplo, suponnha que eu descobri que o valor 21 na coluna linha 4 e coluna dois da minha matriz estava errado, o valor correto deveria ser 25. Como devo proceder? Vamos la’:
minha.matriz[4,2]<-25
Note que do lado esquerdo da flecha eu coloquei o nome da matriz e, entre colchetes o “endereço”, ou seja, [4,2] o valor da linha 4 e coluna 2 (que era 21) é substituído pelo valor 25 como pode ser visto abaixo:
minha.matriz
## meu.vetor meu.vetor2
## [1,] 1 10
## [2,] 2 20
## [3,] 4 30
## [4,] 2 25
## [5,] 5 32
O data.frame ta’bme pode ser construído através da colagem de vetores, como fizemos na matriz, mas neste caso podemos também ter vetores de caracteres como veremos abaixo:
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"
Você pode também criar uma matriz direta, sem juntar vetores, mas definindo primeiro a sua dimensão (números de linhas e colunas) e incluindo os dados. No exemplo abaixo faremos uma matriz com 4 linhas e 5 colunas, usando o comando matrix, seguido por um vetor onde estão os dados e definindo o número de linhas e depois, colunas. Os dados, neste caso são os números de 1 a 20, definidos pelo comando c(1:20) ou seja concatenar uma série de números que vão de 1 a 20.
dados<-c(1:20)
nova.matriz<- matrix(dados, 4, 5)
Note que a nossa matriz (nova.matriz) tem os números de 1 a 20 distribuídos em ordem primeiro preenchendo a coluna 1 e depois as demais. Esta funcão concatenar em um intervalo é útil para se criar séries de números, mas muitas vezes você pode querer repetir números, sem digitá-los um a um novamente, neste caso, usamos a função rep da seguinte forma:
dados2<-c(rep(3,4), rep(4,4), rep(5,4), rep(6,4), rep(7,4))
dados2
## [1] 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7
nova.matriz2<- matrix(dados2, 4, 5)
nova.matriz2
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3 4 5 6 7
## [2,] 3 4 5 6 7
## [3,] 3 4 5 6 7
## [4,] 3 4 5 6 7
Note como funciona o comando: concatenar c uma sequência de números. Estes números são primerio o 3 que é repetido 4 vezes expressos da seguinte forma: rep (valor,número de repetições), isso é feito também para os demais números (4,5,6,7). Desta forma é feita uma sequência de 20 números sendo a repetição 4 vezes de cada um (3,4,5,6 e 7). Depois fizemos uma matriz com estes números para, novamente, mostrar como fazer uma matriz.
Se você achou este tipo de comando um pouco confuso, não se preocupe, não vamos usá-lo agora, mas quando necessário será introduzido novamente. A idéia aqui é mostrar como se gera determinados tipos de dados que podem ser úteis em algumas análises. Na maior parte das aulas a seguir vamos trabalhar com planilhas de dados importadas do Excel, por exemplo, não sendo necessário digitá-las aqui.
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 que fica na memória RAM do seu computador enquanto você está trabalhando com estes dados. 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] "dados" "dados2" "meu.apelido" "meu.data.frame"
## [5] "meu.vetor" "meu.vetor2" "meus.animais" "minha.matriz"
## [9] "minha.soma" "nova.matriz" "nova.matriz2"
Caso você queira apagar ou remover algum objeto do workspace , basta digitar:
rm(meu.vetor2)
ls()
## [1] "dados" "dados2" "meu.apelido" "meu.data.frame"
## [5] "meu.vetor" "meus.animais" "minha.matriz" "minha.soma"
## [9] "nova.matriz" "nova.matriz2"
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 ou Rda) que serve tanto para salvar, objetos (planilha, por exemplo) ou todo o ambiente de trabalho (o famoso workspace).
Para salvar todo o ambiente de trabalho:
save.image("meus.dados.RData")
Para salvar apenas uma planilha (‘data.frame’):
save(meu.data.frame, file="meu.data.frame.Rda")
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.
## 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
## 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 e o tipo 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ê pode 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
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")
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:
attach(crabs)
crabs$FL
plot(FL~CW, data=crabs)
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)
meu.desvio<-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 vamos voltar a trabalhar com o data frame completo para trabalhar nas próximas aulas