Minicurso de Introdução ao R

Esse material foi elaborado para o Minicurso de R do XIII Workshop de Férias em Genética e Melhoramento de Plantas organizado por alunos do Programa de Pós-Graduação em Genética e Melhoramento de Plantas da ESALQ- USP.

Recomendamos também outros materiais disponíveis online, encontre uma lista aqui.

Sugerimos que, antes de iniciar a prática aqui descrita, siga este tutorial para instalação do R e do RStudio.

Familiarização com a interface do RStudio

Abrindo o RStudio você verá:

A interface é separada em quatro janelas com principais funções:

  • Edição de código
  • Ambiente de trabalho e histórico
  • Console
  • Arquivos, gráficos, pacotes e ajuda

Explore cada uma das janelas. São inúmeras funcionalidades para cada uma delas, veremos algumas delas ao decorrer do curso.

Um primeiro script

A janela de edição de código (provavelmente localizada no canto superior esquerdo) você irá utilizar para escrever o seu código. Abra um novo script clicando no + no canto superior esquerdo e selecionando R script.

Vamos então iniciar os trabalhos com o tradicional Hello World. Digite no seu script:

## Hello world

Agora, selecione a linha e aperte o botão Run ou utilize Ctrl + enter.

Ao fazer isso o seu código será processado na janela Console, onde aparecerá em azul (se você estiver com as cores padrão do R) o código escrito e, logo em seguida, o resultado desejado. A linha somente não será processada no console se houver o símbolo # na frente. Agora, experimente colocar # na frente do código escrito. E, novamente, selecione a linha e aperte Run.

#Ficadica

#Ficadica

O símbolo # é muito utilizado para realizar comentários ao decorrer do código. Esta é uma ótima prática para deixar o código organizado e para que você possa lembrar mais tarde o que você mesmo/a estava pensando quando o escreveu ou para que outras pessoas possam entendê-lo. Como no exemplo:

## Hello world

Importante: sempre que quiser realizar alguma alteração, edite o seu script e não diretamente no console, pois tudo o que neste é escrito, não terá como ser salvo!

Para salvar seu script, você pode utilizar a aba Files localizada (como padrão) no canto direito inferior para procurar uma localização de sua preferência, criar uma nova pasta com o nome CursoR.

Dica:

  • Evite colocar espaços e pontuações no nome das pastas e arquivos, isso pode dificultar o acesso via linha de comando no R. Por exemplo, ao invés de Curso R, optamos por CursoR.

Depois, basta clicar no disquete localizado no cabeçalho do RStudio ou com Ctrl + s e selecionar o diretório CursoR criado. Scripts em R são salvos com a extensão .R.

Estabelecendo diretório de trabalho

drawing

Outra boa prática no R é deixar o script no mesmo diretório onde estão seus dados brutos (arquivos de entrada no script) e os dados processados (gráficos, tabelas, etc). Para isso, vamos fazer com que o R identifique o mesmo diretório em que você salvou o script como diretório de trabalho, assim ele entenderá que é dali que precisa obter os dados e para lá que também irão os resultados.

Você pode fazer isso utilizando as facilidades do RStudio, basta localizar o diretório CursoR pela aba Files, clique em More e depois “Set as Working Directory”. Repare que irá aparecer no console algo como:

Ou seja, você pode utilizar este mesmo comando para realizar esta ação. Esta então será nossa pasta de trabalho. Quando estiver perdido/a ou para ter certeza que o diretório de trabalho foi alterado utilize:

Facilitando a vida com Tab

Agora, imagine que você tem um diretório como ~/Documentos/mestrado/semestre1/disciplina_tal/aula_tal/dados_28174/analise_276182/resultados_161/. Não é fácil lembrar todo este caminho para escrever num comando setwd().

Além da facilidade da janela do RStudio, você pode utilizar a tecla Tab para completar o caminho para você. Experimente buscando alguma pasta no seu computador. Basta começar a digitar o caminho e apertar Tab, ele irá completar o nome para você! Se você tiver mais do que um arquivo com aquele início de nome, aperte duas vezes o Tab, ele mostrará todas as opções.

O Tab funciona não só para indicar caminhos, mas também para comandos e nomes de objetos. É muito comum errarmos no código por erros de digitação, utilizar o Tab fará com que reduza significativamente esses erros.

Operações básicas

Vamos então à linguagem!

O R pode funcionar como uma simples calculadora, que utiliza a mesma sintaxe que outros programas (como o excel):

Agora, utilize as operações básicas para solucionar expressão abaixo. Lembre-se de utilizar parênteses () para estabelecer prioridades nas operações.

\((\frac{13+2+1.5}{3})+ log_{4}96\)

Resultado esperado:

## [1] 8.792481

drawing

Os comandos log e sqrt são duas de muitas outras funções básicas que o R possui. Para todas elas o R possui uma descrição para auxiliar no seu uso, para acessar essa ajuda use:

E será aberta a descrição da função na janela Help do RStudio.

Se a descrição do próprio R não for suficiente para você entender como funciona a função, busque no google (de preferência em inglês). Existem diversos sites e fóruns com informações didáticas das funções do R.

Operações com vetores

Classes básicas:

  • character (ex: A, B, C)
  • numeric (ex: 1.1, 2.3)
  • integer (ex: 1, 2, 3)
  • complex (ex: 1 + 0i, 1 + 4i)
  • logical (ex: TRUE, FALSE)

Os vetores são as estruturas mais simples trabalhadas no R. Construímos um vetor com uma sequencia numérica usando:

## [1] 1 3 2 5 2

MUITA ATENÇÃO: O c é a função do R (Combine Values into a Vector or List) com a qual construímos um vetor!

Utilizamos o simbolo : para criar sequencias de números inteiros, como:

##  [1]  1  2  3  4  5  6  7  8  9 10

Podemos utilizar outras funções para gerar sequencias, como:

##  [1]   0   5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80
## [18]  85  90  95 100
##  [1]   0   5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80
## [18]  85  90  95 100
  • Crie uma sequencia utilizando a função seq que varie de 4 a 30, com intervalos de 3 em 3.
## [1]  4  7 10 13 16 19 22 25 28

A função rep gera sequencias com números repetidos:

## [1] 3 4 5 3 4 5
## [1] 3 3 4 4 5 5

Podemos realizar operações utilizando esses vetores:

Repare que já esta ficando cansativo digitar os mesmos números repetidamente, vamos resolver isso criando objetos para armazenar nossos vetores e muito mais.

Criando objetos

drawing

O armazenamento de informações em objetos e a possível manipulação desses faz do R uma linguagem orientada por objetos. Para criar um objeto basta atribuir valores para as variáveis, como a seguir:

Os mais antigos costumam usar o sinal <-, mas tem a mesma função de =. Escolha usar o qual preferir.

Para acessar os valores dentro do objeto basta:

## [1] 30.1 30.4 40.0 30.2 30.6 40.1

A linguagem é sensível à letras maiúsculas e minúsculas, portanto x é diferente de X:

O objeto X não foi criado.

Podemos então realizar as operações com o objeto criado:

E podemos armazenar a operação em outro objeto:

Podemos também aplicar algumas funções, como exemplo:

## [1] 101.59
## [1] 16.93167
## [1] 6.427507

Acessamos somente o 3º valor do vetor criado com []:

Também podemos acessar o número da posição 2 a 4 com:

## [1] 15.35 20.18 15.22

Para obter informações do vetor criado utilize:

##  num [1:6] 15.2 15.3 20.2 15.2 15.4 ...

A função str nos diz sobre a estrutura do vetor, que se trata de um vetor numérico com 6 elementos.

Os vetores também podem receber outras categorias como caracteres:

Outra classe são os fatores, esses podem ser um pouco complexos de lidar.

De forma geral, fatores são valores categorizados por levels, como exemplo, se transformarmos nosso vetor de caracteres clone em fator, serão atribuidos níveis para cada uma das palavras:

##  Factor w/ 4 levels "GRA01","GRA02",..: 2 3 4 2 1 3
## [1] "GRA01" "GRA02" "URO01" "URO03"

Dessa forma, teremos apenas 4 níveis para um vetor com 6 elementos, já que as palavras “GRA02” e “URO01” se repetem. Podemos obter o número de elementos do vetor ou o seu comprimento com:

## [1] 6

Também há vetores lógicos, que recebem valores de verdadeiro ou falso:

## [1] FALSE FALSE FALSE FALSE FALSE  TRUE

Com ele podemos, por exemplo, identificar quais são as posições dos elementos maiores que 40:

## [1] 6
## [1] 40.1

Encontre mais sobre outros operadores lógicos, como o > utilizado, neste link.

Warning1

Faça uma sequência numérica, contendo 10 valores inteiros, e salve em um objeto chamado “a”.

##  [1]  1  2  3  4  5  6  7  8  9 10

Crie outra sequência, utilizando números decimais e qualquer operação matemática, de tal forma que seus valores sejam idênticos ao objeto “a”.

##  [1]  1  2  3  4  5  6  7  8  9 10

Os dois vetores parecem iguais, não?

Então, utilizando um operador lógico, vamos verificar o objeto “b” é igual ao objeto “a”.

##  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE

Alguns valores não são iguais. Como isso é possivel?

##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Warning2

Não é possível misturar diferentes classes dentro de um mesmo vetor, ao tentar fazer isso repare que o R irá tentar igualar para uma única classe:

## [1] "TRUE" "vish" "1"

No caso, todos os elementos foram transformados em caracter.

Algumas Dicas:

  • Cuidado com a prioridade das operações, na dúvida, sempre acrescente parenteses conforme seu interesse de prioridade.
  • Lembre-se que, se esquecer de fechar algum ( ou [ ou ", o console do R ficará esperando você fechar indicando um +, nada será processado até que você digite diretamente no console um ).
  • Cuidado para não sobrepor objetos já criados criando outros com o mesmo nome. Use, por exemplo: altura1, altura2.
  • Mantenha no seu script .R somente os comandos que funcionaram e, de preferência, adicione comentários. Você pode, por exemplo, comentar dificuldades encontradas, para que você não cometa os mesmos erros mais tarde.

Você já pode fazer os exercícios da Sessão 1

Terminamos aqui o primeiro dia.

  • Caso não tenha salvado os objetos criados até agora, obtenha-os aqui.

  • Aqui você pode acessar um exemplo de script .R para esse primeiro dia.

  • E aqui um exemplo de arquivo .Rmd para gerar um relatório com o conteúdo desse primeiro dia. E suas versões compiladas em pdf e html.


Matrizes

As matrizes são outra classe de objetos muito utilizadas no R, com elas podemos realizar operações de maior escala de forma automatizada.

Por serem usadas em operações, normalmente armazenamos nelas elementos numéricos. Para criar uma matriz, determinamos uma sequência de números e indicamos o número de linhas e colunas da matriz:

##      [,1] [,2]
## [1,]    1    7
## [2,]    2    8
## [3,]    3    9
## [4,]    4   10
## [5,]    5   11
## [6,]    6   12

Podemos também utilizar sequencias já armazenadas em vetores para gerar uma matriz, desde que eles sejam numéricos:

##      [,1] [,2]
## [1,] 30.1 0.26
## [2,] 30.4 0.30
## [3,] 40.0 0.36
## [4,] 30.2 0.24
## [5,] 30.6 0.27
## [6,] 40.1 0.35

Com elas podemos realizar operações matriciais:

##      [,1] [,2]
## [1,]    2   14
## [2,]    4   16
## [3,]    6   18
## [4,]    8   20
## [5,]   10   22
## [6,]   12   24
##      [,1] [,2]
## [1,]    1   49
## [2,]    4   64
## [3,]    9   81
## [4,]   16  100
## [5,]   25  121
## [6,]   36  144
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   50   58   66   74   82   90
## [2,]   58   68   78   88   98  108
## [3,]   66   78   90  102  114  126
## [4,]   74   88  102  116  130  144
## [5,]   82   98  114  130  146  162
## [6,]   90  108  126  144  162  180

Utilizar essas operações exige conhecimento de álgebra de matrizes, se quiser se aprofundar a respeito, o livro Linear Models in Statistics, Rencher (2008) possui um boa revisão à respeito. Você também pode explorar a sintaxe do R para essas operações neste link.

Acessamos os números internos à matriz dando as coordenadas [linha,coluna], como no exemplo:

## [1] 0.24

As vezes pode ser informativo dar nomes às colunas e às linhas da matriz, fazemos isso com:

##       altura diametro
## GRA02   30.1     0.26
## URO01   30.4     0.30
## URO03   40.0     0.36
## GRA02   30.2     0.24
## GRA01   30.6     0.27
## URO01   40.1     0.35

Essas funções colnames e rownames também funcionam nos data.frames.

Data.frames

Diferente das matrizes, não realizamos operações com os data.frames, mas eles permitem a união de vetores com classes diferentes. Os data frames são semelhantes a tabelas geradas em outros programas, como o excel.

Os data frames são combinações de vetores de mesmo comprimento. Todos os que criamos até agora tem tamanho 6, verifique.

Podemos assim combiná-los em colunas de um único data.frame:

##    Repeticao Tratamento numero_folhas altura comprimento
## 1          1        L.A             5     95          86
## 2          2        L.A             4     55          30
## 3          3        L.A             5     70          69
## 4          4        L.A            NA     NA          NA
## 5          1        L.B            13     61          80
## 6          2        L.B             9     77          77
## 7          3        L.B            10     80          88
## 8          4        L.B            11     97          87
## 9          1  hibridoAB             6    140          95
## 10         2  hibridoAB             9    155          75
## 11         3  hibridoAB             9    175          95
## 12         4  hibridoAB             9    170         100

Podemos acessar cada uma das colunas com:

##  [1]  95  55  70  NA  61  77  80  97 140 155 175 170

Ou também com:

##  [1]  95  55  70  NA  61  77  80  97 140 155 175 170

Aqui, o número dentro dos colchetes se refere à coluna, por ser o segundo elemento (separado por vírgula). O primeiro elemento se refere à linha. Como deixamos o primeiro elemento vazio, estaremos nos referindo a todas as linhas para aquela coluna.

Dessa forma, se quisermos obter um conteúdo específico podemos dar as coordenadas com [linha,coluna]:

## [1] L.A
## Levels: hibridoAB L.A L.B
  • Obtenha o altura da terceira repetição da Linhagem A.
## [1] 70

Mesmo se tratando de um data frame, podemos realizar operações com os vetores numéricos que a compõe.

  • Com a altura das plantas em centímetros, obtenha em metros:
##  [1] 0.95 0.55 0.70   NA 0.61 0.77 0.80 0.97 1.40 1.55 1.75 1.70

Agora, vamos adicionar o vetor calculado com o volume ao nosso data.frame. Para isso use a função cbind.

## 'data.frame':    12 obs. of  6 variables:
##  $ Repeticao    : int  1 2 3 4 1 2 3 4 1 2 ...
##  $ Tratamento   : Factor w/ 3 levels "hibridoAB","L.A",..: 2 2 2 2 3 3 3 3 1 1 ...
##  $ numero_folhas: num  5 4 5 NA 13 9 10 11 6 9 ...
##  $ altura       : num  95 55 70 NA 61 77 80 97 140 155 ...
##  $ comprimento  : num  86 30 69 NA 80 77 88 87 95 75 ...
##  $ altura_m     : num  0.95 0.55 0.7 NA 0.61 0.77 0.8 0.97 1.4 1.55 ...

Algumas dicas:

  • Lembre-se que, para construir matrizes e data frames, o número de elementos em cada coluna tem que ser iguais.
  • Caso não saiba o operador ou a função que deve ser utilizada, como o desvio padrão, busque no google algo como “desvio padrão R”, ou melhor “standard deviation R”. Logo nas primeiras páginas você obterá respostas. A comunidade do R é bastante ativa e grande parte das suas perguntas sobre ele já foram respondidas em algum lugar da web.
  • Não esqueça que tudo o que fizer no R precisa ser explicitamente indicado, como uma multiplicação 4ac com 4*a*c. Para gerar um vetor 1,3,2,6 é necessário: c(1,3,2,6).

Agora você já pode fazer os exercícios da Sessão 2

Exportando e importando dados

Podemos exportar nossos objetos em diversos formatos, como, por exemplo, .txt ou .csv. Para isso utilizamos:

Obs: Você pode adquirir pacotes para exportar e importar dados com outros fomatos, como exemplo o pacote xlsx exporta e importa dados com formato do excel.

Ao exportar, há diversas opções para a formatação do arquivo, é importante considerá-las se o arquivo for ser trabalhado em outro sofware posteriormente.

Abra os arquivos gerados para visualizar sua formatação.

Esses arquivos podem ser lidos novamente pelo R, utilizando as funções e suas especificações:

Planilha com dados reais

Agora que aprendemos a importar dados, vamos trabalhar com dados reais provenientes de um experimento.

A planilha com os dados será disponibilizada, adicione-a ao seu diretório de trabalho ou indique o caminho da pasta ao importá-la para dentro do R, como a seguir. Caso esteja difícil encontrá-la, acesse:

Aqui usaremos o argumento stringAsFactors que impede que o R transforme os vetores da tabela em fatores, os quais são mais difíceis de trabalhar. O argumento na.strings irá indicar como foram nomeados os dados perdidos.

Vamos explorar a estrutura dos dados coletados:

## 'data.frame':    200 obs. of  8 variables:
##  $ Tempo        : chr  "T1" "T1" "T1" "T1" ...
##  $ Bloco        : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Parcela      : int  1 1 1 1 1 2 2 2 2 2 ...
##  $ Hibrido      : chr  "DKB390" "DKB390" "DKB390" "DKB390" ...
##  $ AlturaPlantas: num  0.513 1.486 1.36 1.096 2.175 ...
##  $ AlturaEspiga : num  0.512 0.733 0.868 0.959 1.4 ...
##  $ NumeroFolhas : int  17 10 9 24 21 14 16 20 12 15 ...
##  $ Estande      : int  9 9 9 9 9 5 5 5 5 5 ...
## [1] 200   8

Estruturas condicionais

if e else

Para nossa próxima atividade com os dados, vamos primeiro entender como funcionam as estruturas if e else.

Nas funções condicionais if e else, estabelecemos uma condição para if, se ela for verdade a atividade será realizada, caso contrário (else) outra tarefa será. Como no exemplo:

## [1] "dois não é maior que três"
  • Verifique se a altura (5ª coluna) do terceiro híbrido (linha 3) é adequada. Envie uma mensagem se ele for pequeno demais, inferior a 1.5, e outra se a altura for adequada.
## [1] "Híbrido pequeno demais"

Podemos espeficiar mais do que uma condição repetindo a estrutura if else:

## [1] "Cresceu demais"

Caso quiséssemos descobrir qual foi a planta com maior altura, uma forma de descobrir é testar qual delas tem o tamanho igual ao máximo:

## [1] "Vou ter que escrever 200 linhas?"

Repare que só é possível utilizar essas estruturas para um elemento individual do vetor, se quisermos percorrer o vetor inteiro precisamos recorrer a outro recurso.

Estruturas de repetição

For

Esse recurso pode ser a função for, uma função muito utilizada e poderosa. Ela constitui uma estrutura de loop, pois irá aplicar a mesma atividade repetidamente até atingir uma determinada condição. Veja exemplos:

## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
##  [1]  10  20  30  40  50  60  70  80  90 100

Nos casos acima, i funciona como um index que irá variar de 1 até 10 a operação determinada entre chaves.

Com essa estrutura, podemos repetir a operação realizada com as estruturas if e else para todo o vetor:

## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"

E assim, descobrir qual é a planta mais alta:

## [1] "A planta 8 é a maior planta"
## [1] "A planta 8 é a maior planta"

Dica: Identação

Repare a diferença:

Loops dentro de loops

É possível também utilizarmos estruturas de repetição dentro de estruturas de repetição. Por exemplo, se quisermos trabalhar tanto nas colunas como nas linhas de uma matrix.

##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    2    4    6    8   10   12   14   16   18    20
##  [3,]    3    6    9   12   15   18   21   24   27    30
##  [4,]    4    8   12   16   20   24   28   32   36    40
##  [5,]    5   10   15   20   25   30   35   40   45    50
##  [6,]    6   12   18   24   30   36   42   48   54    60
##  [7,]    7   14   21   28   35   42   49   56   63    70
##  [8,]    8   16   24   32   40   48   56   64   72    80
##  [9,]    9   18   27   36   45   54   63   72   81    90
## [10,]   10   20   30   40   50   60   70   80   90   100

Fizemos um vídeo com mais detalhes sobre loops no R, aumentem nossa quantidade de views e likes por .

Faça os exercícios da Sessão 3

Algumas dicas:

  • Cuidado ao rodar o mesmo comando mais de uma vez, algumas variáveis podem não ser mais como eram antes. Para que o comando funcione da mesma forma é necessário que os objetos de entrada estejam da forma como você espera.
  • Lembrem-se que = é para definir objetos e == é o sinal de igualdade.
  • Nas estruturas condicionais e de repetição, lembrem-se que é necessário manter a sintaxe esperada: If(){} e for(i in 1:10){}. No for, podemos trocar a letra que será o índice, mas é sempre necessário fornecer uma sequência de inteiros contínua.
  • Usar identação ajuda a visualizar o começo e fim de cada estrutura de código e facilita o abrir e fechar de chaves. Identação são aqueles espaços que usamos antes da linha

Paramos aqui no segundo dia do treinamento.

  • Caso não tenha salvado os objetos criados até agora, obtenha-os aqui.

  • Aqui você pode acessar um exemplo de script .R.

  • E aqui um exemplo de arquivo .Rmd para gerar um relatório com o conteúdo até agora. E suas versões compiladas em pdf e html.

Elaboração de gráficos simples

Para outros dados coletados, vamos gerar alguns gráficos simples utilizando as funções básicas do R. Existem pacotes como o ggplot2, plotly e shiny que possuem ferramentas muito poderosas para construção de gráficos, mas exigem um pouco mais de tempo para aprendizagem de sua sintaxe.

Os tipos mais comuns já possuem funções próprias, mas outros gráficos podem ser customizados de acordo com a necessidade do usuário. Vamos iniciar com um simples gráfico de frequências (ou histograma) para os dados de Altura.

Vamos adicionar alguns argumentos para dar uma personalizada:

  • breaks para definir os intervalos para cada barra;

Agora tente fazer o histograma para o altura de espiga, aproveite para tentar alterar alguns parâmetros.

Apresentaremos outros gráficos que poderão ser utilizados:

Boxplot

Explore o bloxplot de outros atributos, podendo combiná-los. Como desafio, tente fazer o boxplot da altura pela combinação de Hibridos e Blocos:

Parâmetros gráficos

É possível customizar os gráficos alterando seus eixos, cores, fontes, etc. Começaremos através do histograma:

  • col para adicionar cor;
  • xlab alterar título do eixo x;
  • ylab alterar título do eixo y;
  • main alterar título geral;

Vamos explorar um pouco mais o gráfico de pontos. Vamos verificar se existe uma correlação entre o a altura de plantas e a altura da primeira espiga:

## [1] 0.7678205

Alguns argumentos são específicos para cada função, busque mais informações sobre cada uma delas para entender sobre seus argumentos. Outros parâmetros gráficos mais recorrentes são os relacionados com:

  • O tamanho de texto e símbolos, chamados de cex;
  • Os símbolos de plotagem (25 ao todo), através do parâmetro pch;
  • Há os relacionados com a fonte (font e family);
  • Cores (col, bg, fg);

Agora, busque alterar o nome dos rótulos (lab) e do título (main). Também utilize o parâmetro ‘pch=’ e coloque um número de 0 a 25.

De maneira similar ao tamanho, tente alterar as cores (utilize o color() para ver todas as cores disponíveis).

Salvar gráficos

Os gráficos podem ser salvos através dos menus disponíveis no RStudio, ou através de funções que permitem salvar em formatos específicos. Algumas delas são: pdf(); png(); jpeg(); bitmap(). De maneira geral, o parâmetro primordial é fornecer o nome do arquivo que será gerado (contendo sua extensão). Após abrir a função gráfica, deve-se gerar o gráfico de interesse. Por fim, utiliza-se o comando dev.off() para que saída gráfica volte para o console.

Gere um gráfico e salve-o no formato de seu interesse. Em seguida, crie diversos gráficos dentro de uma mesma função gráfica e estude a saída.

Instalação e aplicações de pacotes

O que deixa o R ainda mais poderoso é a capacidade de incorporármos à ele novas funções chamando pacotes. Existem milhares de pacotes disponíveis no CRAN (repositorio oficial), e outros repositórios. Para cada área de estudo existem diversos pacotes disponíveis. Aqui usaremos o pacote desplot.

Como ele esta disponível no CRAN, para instalá-lo basta:

Depois disso é necessário recrutá-lo com:

Este pacote é um conjunto de funções elaboradas para gerar gráficos de campo. Você pode obter mais informações sobre ele no manual disponível no CRAN.

Com esse pacote podemos desenhar o experimento de campo (assim como esta no papel que recebeu, mas um pouco mais bonito).

Para isso vamos adicionar duas outras colunas no nossa data.frame, com informações da posição de cada indivíduo no campo.

Para usar a função do pacote, buscamos no google por tutoriais, aqui esta aquele no qual nos baseamos para elaborarmos o código abaixo.

Algumas ferramentas básicas de análise de dados

A planilha com os dados será disponibilizada, adicione-a ao seu diretório de trabalho ou indique o caminho da pasta ao importá-la para dentro do R, como a seguir. Caso esteja difícil encontrá-la, acesse:

Claramente a análise de dados é algo muito específico de cada conjunto de dados e interesses. Vamos aqui mostrar alguns recursos básicos como análise de variância, regressão e teste de médias.

Algumas avaliações descritivas podem ser feitas pelo uso do tapply e de gráficos. A função summary também da informações gerais do conjunto. É possível usá-la em conjunto com o tapply.

## 'data.frame':    20 obs. of  5 variables:
##  $ gen    : Factor w/ 10 levels "2","22","2d",..: 1 1 3 3 9 9 10 10 5 5 ...
##  $ rep    : int  1 2 1 2 1 2 1 2 1 2 ...
##  $ prim_in: num  7 4.5 7.5 6.5 8 9.5 13 10 19 7 ...
##  $ alt    : num  60 42 43 45 45 58 50 64 46 55 ...
##  $ prod   : num  27.5 19.2 19.7 20.6 20.6 ...
## $`2`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    42.0    46.5    51.0    51.0    55.5    60.0 
## 
## $`22`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   48.00   53.12   58.25   58.25   63.38   68.50 
## 
## $`2d`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    43.0    43.5    44.0    44.0    44.5    45.0 
## 
## $`35`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   39.00   43.25   47.50   47.50   51.75   56.00 
## 
## $`71`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   46.00   48.25   50.50   50.50   52.75   55.00 
## 
## $`74`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   49.00   49.62   50.25   50.25   50.88   51.50 
## 
## $`80`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   27.25   33.50   33.50   39.75   46.00 
## 
## $DOS
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.00   53.25   56.50   56.50   59.75   63.00 
## 
## $T8
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   45.00   48.25   51.50   51.50   54.75   58.00 
## 
## $T9
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    50.0    53.5    57.0    57.0    60.5    64.0
## $`1`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   43.50   47.50   47.15   50.00   68.50 
## 
## $`2`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   42.00   46.50   53.25   52.85   57.50   64.00

Qual a relaçao entre altura de plantas e o primeiro entrenó?

## [1] 0.2026697

Podemos falar que a altura de plantas é significativamente diferente entre hibridos?

##             Df Sum Sq Mean Sq F value Pr(>F)
## gen          9  954.7   106.1   0.929  0.539
## Residuals   10 1141.8   114.2

O p-valor nos indica se podemos considerar diferenças de altura conforme o híbrido. Podemos também fazer um teste de médias para diferenciar a altura de plantas de cada híbrido. Aqui utilizaremos o método de Tukey:

##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = alt ~ gen, data = dados_pim)
## 
## $gen
##          diff       lwr      upr     p adj
## 22-2     7.25 -35.04932 49.54932 0.9990485
## 2d-2    -7.00 -49.29932 35.29932 0.9992729
## 35-2    -3.50 -45.79932 38.79932 0.9999976
## 71-2    -0.50 -42.79932 41.79932 1.0000000
## 74-2    -0.75 -43.04932 41.54932 1.0000000
## 80-2   -17.50 -59.79932 24.79932 0.8054126
## DOS-2    5.50 -36.79932 47.79932 0.9998931
## T8-2     0.50 -41.79932 42.79932 1.0000000
## T9-2     6.00 -36.29932 48.29932 0.9997838
## 2d-22  -14.25 -56.54932 28.04932 0.9230467
## 35-22  -10.75 -53.04932 31.54932 0.9847292
## 71-22   -7.75 -50.04932 34.54932 0.9984267
## 74-22   -8.00 -50.29932 34.29932 0.9980093
## 80-22  -24.75 -67.04932 17.54932 0.4505023
## DOS-22  -1.75 -44.04932 40.54932 1.0000000
## T8-22   -6.75 -49.04932 35.54932 0.9994514
## T9-22   -1.25 -43.54932 41.04932 1.0000000
## 35-2d    3.50 -38.79932 45.79932 0.9999976
## 71-2d    6.50 -35.79932 48.79932 0.9995917
## 74-2d    6.25 -36.04932 48.54932 0.9997005
## 80-2d  -10.50 -52.79932 31.79932 0.9868671
## DOS-2d  12.50 -29.79932 54.79932 0.9620165
## T8-2d    7.50 -34.79932 49.79932 0.9987696
## T9-2d   13.00 -29.29932 55.29932 0.9526637
## 71-35    3.00 -39.29932 45.29932 0.9999994
## 74-35    2.75 -39.54932 45.04932 0.9999997
## 80-35  -14.00 -56.29932 28.29932 0.9296976
## DOS-35   9.00 -33.29932 51.29932 0.9953549
## T8-35    4.00 -38.29932 46.29932 0.9999926
## T9-35    9.50 -32.79932 51.79932 0.9932470
## 74-71   -0.25 -42.54932 42.04932 1.0000000
## 80-71  -17.00 -59.29932 25.29932 0.8268907
## DOS-71   6.00 -36.29932 48.29932 0.9997838
## T8-71    1.00 -41.29932 43.29932 1.0000000
## T9-71    6.50 -35.79932 48.79932 0.9995917
## 80-74  -16.75 -59.04932 25.54932 0.8372283
## DOS-74   6.25 -36.04932 48.54932 0.9997005
## T8-74    1.25 -41.04932 43.54932 1.0000000
## T9-74    6.75 -35.54932 49.04932 0.9994514
## DOS-80  23.00 -19.29932 65.29932 0.5342839
## T8-80   18.00 -24.29932 60.29932 0.7829648
## T9-80   23.50 -18.79932 65.79932 0.5097255
## T8-DOS  -5.00 -47.29932 37.29932 0.9999512
## T9-DOS   0.50 -41.79932 42.79932 1.0000000
## T9-T8    5.50 -36.79932 47.79932 0.9998931

Experimento de café

Agora, vamos trabalhar com outro conjunto de dados, contendo informações de um experimento de café. Acesse aqui:

O experimento trata-se de dados em blocos completos casualizados de 10 progênies de café. Nele contém uma coluna rep para especificar a qual repetição o dado se refere, outra para qual indivíduo da progênie (prog) e outra para indicar em qual colheita o dado foi retirado (colheita).

## 'data.frame':    120 obs. of  4 variables:
##  $ rep     : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ prog    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ colheita: int  1 1 1 1 1 1 1 1 1 1 ...
##  $ prod    : num  4.3 13.2 1.59 2.76 11.38 ...

Não esqueça que é necessário que o arquivo esteja no seu ambiente de trabalho ou que você especifique o caminho completo para que o R o encontre.

Para essa análise de dados, nossa variável resposta é a produção (prod), a repetição (rep), a progênie (prog) e a colheita serão fatores no nosso modelo, identificados por seus níveis.

## 'data.frame':    120 obs. of  4 variables:
##  $ rep     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prog    : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prod    : num  4.3 13.2 1.59 2.76 11.38 ...
## 'data.frame':    120 obs. of  4 variables:
##  $ rep     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prog    : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prod    : num  4.3 13.2 1.59 2.76 11.38 ...

Vamos primeiro análisar somente os dados referentes à primeira colheira. Podemos fazer um subset somente com esses dados.

## 'data.frame':    40 obs. of  4 variables:
##  $ rep     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prog    : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prod    : num  4.3 13.2 1.59 2.76 11.38 ...

Repare que, ao fazer o subset, o conjunto de dados ainda mantém os três níveis do fator colheira, embora agora só tenhamos um. Isso pode ser um problema para a nossa análise, vamos remover os níveis excedentes com:

## 'data.frame':    40 obs. of  4 variables:
##  $ rep     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prog    : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ colheita: Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ prod    : num  4.3 13.2 1.59 2.76 11.38 ...

Agora podemos rodar nosso modelo de análise de variância.

## Analysis of Variance Table
## 
## Response: prod
##           Df Sum Sq Mean Sq F value   Pr(>F)    
## rep        3  58.90  19.633  2.1836 0.113071    
## prog       9 410.32  45.591  5.0708 0.000475 ***
## Residuals 27 242.75   8.991                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Essa análise variância exige alguns pressupostos, podemos verificar eles nos nossos dados usando:

##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "contrasts"     "xlevels"       "call"          "terms"        
## [13] "model"
## 
##  Shapiro-Wilk normality test
## 
## data:  Modelo1_residuals
## W = 0.96494, p-value = 0.2461

Agora, vamos precisar de funções contidas nos scripts DIAGNOSTICS.R e "outliers.R". Acesse eles em:

As vezes outliers podem ser difíceis de identificarmos, aqui esta uma função (detalhes sobre a identificação e remoção de outliers estão disponíveis no artigo Bernal-Vasquez, AM., Utz, HF. & Piepho, HP. Theor Appl Genet-2016) que pode fazer isso:

## No outlier detected
## numeric(0)

Guardando o valor do quadrado médio:

## [1] 8.990907

E a média da primeira colheita da nossa variavel resposta (produção):

## [1] 8.54525

Com eles podemos calcular o coeficiente de variação (CV):

## [1] 35.08948

Calcule o CVe e QME para a colheita 2

Crie uma função calcular o CVe

Possibilidade de respostas:

## [1] 35.08948

Podemos também calcular a herdabilidade da característica produção:

## [1] 0.5043871

Feedback e outros materiais

Caso tenha sugestões para aprimoramento desse material, enviar e-mail para gent.esalq@gmail.com.

Acesse também outros materiais em português produzidos por Cristiane Taniguti, Fernando Correr e Rodrigo Amadeu aqui.

Este material foi produzido por alunos do programa de pós-graduação em Genética e Melhoramento de Plantas. Ana Letycia Basso Garcia, Cristiane Taniguti, Fernando Correr, Guilherme Hokasa e Victor Mello ministraram o Treinamento.

Também recomendamos materiais em inglês aqui.

GENt
Escola Superior de Agricultura Luiz de Queiroz
Universidade de São Paulo

2019-07-24