Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| — | 02_tutoriais:tutorial3:start [2025/08/25 20:58] (atual) – criada - edição externa 127.0.0.1 | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | <WRAP tabs> | ||
| + | * [[02_tutoriais: | ||
| + | * [[01_curso_atual: | ||
| + | * [[03_apostila: | ||
| + | </ | ||
| + | ====== 3. Tutoriais de Leitura e Manipulação de dados no R ====== | ||
| + | <WRAP center round box 60%> | ||
| + | //**__Os 10 mandamentos do R__**// | ||
| + | Agora que já tem alguma experiência com a linguagem, veja os 10 mandamentos do R! | ||
| + | Ao final do curso revisite esses mandamentos e avalie quantos pecados deve confessar. | ||
| + | * ** [[: | ||
| + | </ | ||
| + | |||
| + | ====== Objetos de Dados ====== | ||
| + | |||
| + | ===== Vetores como estrutura básica de dados ===== | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | Nos tutoriais anteriores, nós usamos uma classe de objetos que é a estrutura básica de armazenamento de dados no R, a classe de objetos vetores. | ||
| + | Vamos revisitar alguns conceitos neste tópico, criando um vetor de dados numéricos, chamado '' | ||
| + | |||
| + | <code rsplus | Criando Vetor > | ||
| + | |||
| + | num <- seq(0, 15, len=7) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Agora vamos olhar os valores do objeto criado, em seguida elevar cada valor ao quadrado, atribuindo o resultado ao objeto " | ||
| + | |||
| + | <code rsplus| Operando vetor> | ||
| + | num | ||
| + | length(num) | ||
| + | class(num) | ||
| + | num2 <- num^2 | ||
| + | num2 | ||
| + | sqrt(num2) | ||
| + | num | ||
| + | |||
| + | </ | ||
| + | |||
| + | Agora vamos extrair apenas o quinto elemento e em seguida substituir esse elemento pela palavra " | ||
| + | |||
| + | <code rsplus| Quinto elemento> | ||
| + | |||
| + | num[5] | ||
| + | num[5] <- " | ||
| + | num | ||
| + | num[-5] | ||
| + | |||
| + | length(num) | ||
| + | class(num) | ||
| + | num^2 | ||
| + | sqrt(num^2) | ||
| + | |||
| + | </ | ||
| + | |||
| + | O que aconteceu aqui? Por que não conseguimos mais operar o vetor '' | ||
| + | |||
| + | <code rsplus| Retorno do elemento> | ||
| + | num[5] <- 10 | ||
| + | num | ||
| + | num^2 | ||
| + | sqrt(num^2) | ||
| + | </ | ||
| + | |||
| + | Por que ainda não conseguimos? | ||
| + | |||
| + | <code rsplus | Classe do vetor> | ||
| + | length(num) | ||
| + | class(num) | ||
| + | num <- as.numeric(num) | ||
| + | sqrt(num^2) | ||
| + | </ | ||
| + | |||
| + | Como já havíamos visto, uma das característica do vetor é que **só armazena um tipo de natureza de dados** e o R faz a coerção da classe do objeto dependendo da característica desses dados. Incluir algo que não é dígito ou símbolo de decimal em um objeto da classe numérica faz com que a classe seja convertida automaticamente em '' | ||
| + | <WRAP center round tip 60%> | ||
| + | |||
| + | A raiz de um valor elevado ao quadrado é o próprio valor? O que aconteceria se o vetor fosse de números negativos? Veja a discussão sobre função quadrática e raiz quadrada como [[http:// | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Leitura de Dados ===== | ||
| + | |||
| + | A principal função para a leitura de dados no R é '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | |||
| + | {{: | ||
| + | O artigo [[https:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | Tendo a planilha eletrônica com os dados brutos bem estruturados, | ||
| + | |||
| + | Ao exportar os dados deve ficar atento para algumas opções de exportação da planilha, as principais são os caracteres para designar a separação de campo e o símbolo de decimal. Evite, sempre que possível, caracteres especiais como acentos e aspas ('' | ||
| + | |||
| + | Sabendo o formato que os dados foram salvos no arquivo texto, na maioria dos casos, precisamos apenas do seguintes argumentos para fazer a leitura dos dados no R (('' | ||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | **__Principais argumentos do__** '' | ||
| + | |||
| + | ^ Argumento ^ Descrição ^ Padrão ^ Alternativas^ | ||
| + | | file | nome do arquivo ((incluíndo a extensão e o caminho, caso não esteja no diretório de trabalho)) |<code rsplus> " | ||
| + | | header | nome das variáveis ((utiliza a primeira linha dos dados para o nome das colunas))| <code rsplus> | ||
| + | | sep | separador ((qual o símbolo separa os dados de uma mesma linha em colunas. Ex: " | ||
| + | | dec | símbolo de decimal | <code rsplus>" | ||
| + | | as.is| mantenha caracteres ((O padrão até a versão 4.0 do R era transformar caracteres em fator na leitura. A partir dessa versão o padrão mudou e a versão mais recente da função não faz essa transformação automática. )) | <code rsplus> TRUE </ | ||
| + | |||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Verificando a leitura ==== | ||
| + | |||
| + | Logo após a leitura dos dados é recomendável fazer a verificação do objeto lido para ter certificar que os dados foram lidos corretamente. É possível retornar na tela todo o objeto criado, mas para conjunto de dados grandes, fica difícil a visualização. Para isso, usamos algumas funções acessórias que extraem atributos ou parte dos dados. As principais são: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Dados de Caixeta ==== | ||
| + | |||
| + | |||
| + | Entre na página [[: | ||
| + | |||
| + | |||
| + | **Obs.**: Se o arquivo abrir em uma aba do navegador, clique com o botão direito do mouse no link e selecione " | ||
| + | |||
| + | Vamos fazer a leitura do arquivo com o padrão de leitura da função '' | ||
| + | |||
| + | |||
| + | <code rsplus|Lendo caixeta> | ||
| + | caixeta <- read.table(file = " | ||
| + | </ | ||
| + | |||
| + | Esse código retornar o erro: | ||
| + | |||
| + | <code rsplus| Lendo caixeta?> | ||
| + | Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : | ||
| + | line 5 did not have 3 elements | ||
| + | </ | ||
| + | |||
| + | Indicando que tentou ler o arquivo, mas algumas linhas tinham dimensões diferentes, ou seja, o formato não era tabular. Isso ocorre, normalmente, | ||
| + | |||
| + | |||
| + | <code rsplus| Relendo caixeta> | ||
| + | caixeta <- read.table(file = " | ||
| + | class(caixeta) | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | <WRAP center round box 100%> | ||
| + | **__Leitura de dados Online__** | ||
| + | |||
| + | A função '' | ||
| + | |||
| + | |||
| + | <code rsplus| Caixeta url> | ||
| + | caixeta <- read.table(file = " | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Data Frames ===== | ||
| + | |||
| + | A classe do objeto é um '' | ||
| + | |||
| + | Vamos insistir em uma sugestão importante, que evita muitos transtornos para quem está iniciando no R é: depois de efetuar a leitura **sempre verificar a estrutura dos dados antes de iniciar as análises**, | ||
| + | |||
| + | |||
| + | <code rsplus| Verifica caixesta> | ||
| + | dim(caixeta) | ||
| + | names(caixeta) | ||
| + | str(caixeta) | ||
| + | head(caixeta) | ||
| + | </ | ||
| + | |||
| + | Apesar do objeto ter sido lido, ele não parece o que deveria. A dimensão do objeto mostra que tem uma observação a mais, os nomes das variáveis não corresponde ao que está definido no metadado e as variáveis foram todas lidas com '' | ||
| + | |||
| + | |||
| + | <code rsplus| Caixeta header> | ||
| + | caixeta <- read.table(file = " | ||
| + | dim(caixeta) | ||
| + | names(caixeta) | ||
| + | str(caixeta) | ||
| + | head(caixeta) | ||
| + | </ | ||
| + | |||
| + | No código acima temos resultados que podem variar dependendo da versão do R. Isso não é muito comum, pois a equipe de desenvolvedores busca manter a compatibilidade dos scripts entre versões. | ||
| + | |||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | |||
| + | **__stringsAsFactors__** | ||
| + | |||
| + | Por padrão, até a versão anterior a 4.0.0 de abril de 2020, o padrão das funções '' | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Incluir Variáveis ==== | ||
| + | |||
| + | |||
| + | Vamos então transformar as variáveis '' | ||
| + | |||
| + | |||
| + | |||
| + | <code rsplus| Fatores caixeta > | ||
| + | caixeta$local <- factor(caixeta$local) | ||
| + | caixeta$ssp <- factor(caixeta$especie) | ||
| + | str(caixeta) | ||
| + | </ | ||
| + | |||
| + | Percebam que na primeira linha de comando estamos sobrescrevendo a variável '' | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | |||
| + | **Incluir Variáveis no '' | ||
| + | |||
| + | Para incluir novas variáveis no '' | ||
| + | |||
| + | <code rsplus| Ciclando NA> | ||
| + | caixeta$dap <- NA | ||
| + | str(caixeta) | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | No quadro acima criamos uma variável chamada '' | ||
| + | |||
| + | $$ dap = \frac{cap}{pi} $$ | ||
| + | |||
| + | |||
| + | <code rsplus| Cap para dap> | ||
| + | caixeta$dap <- caixeta$cap/ | ||
| + | str(caixeta) | ||
| + | </ | ||
| + | |||
| + | Aqui também temos a regra da ciclagem com o valor da constante '' | ||
| + | |||
| + | |||
| + | ==== Indexação ==== | ||
| + | |||
| + | Acima usamos a indexação da coluna do '' | ||
| + | |||
| + | <code rsplus| Estrutura da variável> | ||
| + | str(caixeta$especie) | ||
| + | str(caixeta$cap) | ||
| + | </ | ||
| + | |||
| + | O que temos é a estrutura básica de armazenamento de dados: vetores das classes básicas de dado. Portanto, para indexar as posições nesse vetores, podemos usar a indexação básica de vetores: | ||
| + | |||
| + | |||
| + | <code rsplus| Indexando posição> | ||
| + | caixeta$dap[1] | ||
| + | caixeta$dap[c(1, | ||
| + | caixeta$dap[seq(1, | ||
| + | </ | ||
| + | |||
| + | Uma outra forma de indexar é pelas posições da linha e coluna. No caso do '' | ||
| + | |||
| + | |||
| + | <code rsplus| Indexando duas dimensões> | ||
| + | caixeta[1, 9] | ||
| + | caixeta[c(1, | ||
| + | caixeta[seq(1, | ||
| + | </ | ||
| + | |||
| + | |||
| + | Por fim, é possível também combinar nomes das variáveis com as posições das observações: | ||
| + | |||
| + | <code rsplus| Indexando por nome> | ||
| + | caixeta[1, " | ||
| + | caixeta[c(1, | ||
| + | caixeta[seq(1, | ||
| + | </ | ||
| + | |||
| + | Inclusive, combinar nomes de variáveis: | ||
| + | |||
| + | <code rsplus| Indexando duas variáveis> | ||
| + | caixeta[1, c(" | ||
| + | caixeta[c(1, | ||
| + | caixeta[seq(1, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Indexação com Lógica ==== | ||
| + | |||
| + | Para apresentar essa última forma de indexação, | ||
| + | |||
| + | <code rsplus| Os trapalhões> | ||
| + | trapalhoes <- data.frame(nomes = c(" | ||
| + | </ | ||
| + | |||
| + | Vamos agora calcular a idade dos meninos: | ||
| + | |||
| + | <code rsplus| Operando variáveis> | ||
| + | ano.atual <- as.numeric(format(Sys.Date(), | ||
| + | ano.atual - trapalhoes$ano.nasc | ||
| + | trapalhoes$idade <- ano.atual - trapalhoes$ano.nasc | ||
| + | </ | ||
| + | |||
| + | Tá bom! Vou explicar a primeira linha de comando, ao mesmo tempo, indicar o caminho para entender comandos mais complicados em geral. Primeiro temos a característica da sintaxe aninhada, padrão do R. Para entender o que está sendo feito, pegue a função mais interna e veja o que ela está retornando, em seguida veja o que função externa a ela está fazendo com esse resultado, e assim por diante! | ||
| + | |||
| + | <code rsplus| Dilacerando o código> | ||
| + | Sys.Date() | ||
| + | format(Sys.Date(), | ||
| + | as.numeric(format(Sys.Date(), | ||
| + | </ | ||
| + | <WRAP center round tip 100%> | ||
| + | |||
| + | **Por que?** | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | Pois bem, estamos primeiro pegando a data atual armazenada no computador, depois pegando apenas o ano e em seguida transformando o ano em número. Ué? Não seria mais fácil digitar o ano diretamente? | ||
| + | |||
| + | </ | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | Para extrair informações específicas do '' | ||
| + | |||
| + | <code rsplus| Operação lógica> | ||
| + | antes40 <- trapalhoes$ano.nasc < 1940 | ||
| + | antes40 | ||
| + | </ | ||
| + | |||
| + | O resultado desse teste lógico é um vetor de '' | ||
| + | |||
| + | <code rplus> | ||
| + | [1] TRUE TRUE FALSE TRUE | ||
| + | </ | ||
| + | |||
| + | Ele nos diz que a condição é verdadeira para todas as posições menos para a terceira. Como o vetor lógico tem o mesmo comprimento do número de linhas, podemos então indexar o nosso '' | ||
| + | |||
| + | <code rsplus| Indexação com lógica> | ||
| + | trapalhoes[antes40, | ||
| + | </ | ||
| + | |||
| + | ou diretamente, | ||
| + | |||
| + | <code rsplus| Indexação com operação lógica> | ||
| + | trapalhoes[trapalhoes$ano.nasc < 1940, ] | ||
| + | </ | ||
| + | |||
| + | |||
| + | Note que fizemos a indexação pelas linhas, deixando a indexação da coluna vazia, ou seja, solicitando retornar todas as colunas para as linhas em que o vetor '' | ||
| + | |||
| + | Nossa pergunta foi mais específica, | ||
| + | |||
| + | <code rsplus| Indexando ambas dimensões> | ||
| + | trapalhoes[antes40, | ||
| + | </ | ||
| + | |||
| + | Nesse caso, a indexação da coluna pode ser feita pelo nome da variável ou pela posição e também pode ser combinada. | ||
| + | |||
| + | E se quisermos o inverso, o nome e a idade dos que nasceram depois de 1940? Precisamos só inverter o vetor de '' | ||
| + | |||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | |||
| + | |||
| + | <code rsplus| Invertendo a lógica> | ||
| + | trapalhoes[!antes40, | ||
| + | </ | ||
| + | [[https:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | Essas são as principais instrumentações de indexação no R. Aplicadas em um '' | ||
| + | |||
| + | |||
| + | Quais árvores, na amostra da Juréia, tem mais de 100 mm de dap? | ||
| + | |||
| + | <code rsplus| Combinando lógica> | ||
| + | jureiaVF <- caixeta$local == " | ||
| + | bigtree <- caixeta$dap > 100 | ||
| + | caixeta[jureiaVF & bigtree, ] | ||
| + | </ | ||
| + | |||
| + | |||
| + | Aqui utilizamos o operador lógico ''&'' | ||
| + | |||
| + | |||
| + | E para saber quantas árvores tem na amostra da Juréia, quantas dessas são grandes e em que proporção? | ||
| + | Lembra que o '' | ||
| + | <code rsplus| Opera lógica> | ||
| + | sum(jureiaVF) | ||
| + | sum(bigtree & jureiaVF) | ||
| + | sum(bigtree & jureiaVF)/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Salvando Data Frame ==== | ||
| + | |||
| + | Após manipular os dados no R podemos salvar uma nova versão em um arquivo texto. Para salvar a nossa nova versão dos dados de caixetais, que incorpora o '' | ||
| + | |||
| + | <code rsplus| Salvando arquivos de dados> | ||
| + | write.table(caixeta, | ||
| + | |||
| + | </ | ||
| + | |||
| + | Caso receba a mensagem de erro: | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | Error in file(file, ifelse(append, | ||
| + | cannot open the connection | ||
| + | In addition: Warning message: | ||
| + | In file(file, ifelse(append, | ||
| + | cannot open file ' | ||
| + | </ | ||
| + | |||
| + | Significa que o caminho para gravar o arquivo tem algum problema, no caso não há a pasta '' | ||
| + | |||
| + | <code rsplus| Criando pastas> | ||
| + | dir.create(" | ||
| + | dir.exists(" | ||
| + | dir() | ||
| + | </ | ||
| + | |||
| + | Agora podemos rodar novamente a linha de comando do '' | ||
| + | |||
| + | |||
| + | <WRAP center round tip 90%> | ||
| + | **__Formato de Arquivo de Dados__** | ||
| + | |||
| + | Arquivos de dados no formato de texto são uma forma segura de salvar conjunto de dados pequenos ou medianos ( ~100 mil registros). Os formatos mais usados são os com campo separados por espaço (padrão do '' | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Matrix e Array ===== | ||
| + | <WRAP center round box 60%> | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Matrizes ===== | ||
| + | |||
| + | Outro tipo de objeto no R com estrutura tabular é a '' | ||
| + | |||
| + | Vamos aprender o objeto '' | ||
| + | |||
| + | ==== Operações Matriciais ==== | ||
| + | |||
| + | {{: | ||
| + | Uma forma de representar essas populações estruturadas((apresentam estágios diferentes)) é com diagramas mostrando as transições e permanências entre estados. | ||
| + | |||
| + | Uma forma compacta de representar matematicamente essas transições e permanência é utilizando a forma de matriz, que nesse caso se chama **//matriz de transição// | ||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | Uma população de //Escobaria robbinsiorum// | ||
| + | <WRAP center round box 60%> | ||
| + | **// | ||
| + | {{ : | ||
| + | <WRAP center round box 90%> | ||
| + | |||
| + | |||
| + | 0,43 0 0,56 | ||
| + | 0,33 0,61 0 | ||
| + | 0 | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Os elementos da matriz, com exceção da fecundidade (F2 e F3 no diagrama), são as probabilidades de transição, | ||
| + | |||
| + | Vamos criar um objeto da classe matriz com esses valores. Isso nos permitirá realizar operações matriciais para prever o tamanho da população. | ||
| + | |||
| + | <code rsplus| Criando matriz> | ||
| + | matCory <- matrix( c(0.43, 0.33, 0, 0, 0.61, 0.3, 0.52, 0, 0.96), nrow = 3, ncol = 3) | ||
| + | matCory | ||
| + | </ | ||
| + | |||
| + | A indexação da '' | ||
| + | |||
| + | <code rsplus| Indexando matriz> | ||
| + | matCory[1, 3] | ||
| + | matCory[1, 3] <- 0.56 | ||
| + | matCory | ||
| + | </ | ||
| + | |||
| + | Aqui estamos usando uma regra básica dos objetos de dados no R: se consegue extrair um elemento de um objeto é possível atribuir algo a essa posição. | ||
| + | |||
| + | |||
| + | Agora crie um vetor com as abundâncias iniciais de indivíduos em cada classe. Vamos começar com uma população de 50 plântulas , 25 jovens e 10 adultos. | ||
| + | |||
| + | <code rsplus| Vetor de tamanho populacional> | ||
| + | popN0 <- c(50, 25, 10) | ||
| + | popN0 | ||
| + | </ | ||
| + | |||
| + | Para calcular o número de indivíduos em cada estágio após um intervalo de tempo, basta multiplicar a matriz de transição pelas abundâncias dos indivíduos em cada estágio. Usamos o operador de multiplicação matricial '' | ||
| + | <code rsplus| Multiplicação matricial> | ||
| + | popN1 <- matCory %*% popN0 | ||
| + | popN1 | ||
| + | popN2 <- matCory %*% popN1 | ||
| + | popN2 | ||
| + | popN3 <- matCory %*% popN2 | ||
| + | popN3 | ||
| + | </ | ||
| + | |||
| + | Vamos agora armazenar a trajetória do tamanho dos estágios na população em uma matrix: | ||
| + | |||
| + | <code rsplus| Matriz de tamanho populacional> | ||
| + | pop <- matrix(c(popN0, | ||
| + | colnames(pop) <- c(" | ||
| + | pop | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code rsplus| O que acontece aqui?> | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | </ | ||
| + | |||
| + | No código acima, fazemos a multiplicação matricial '' | ||
| + | |||
| + | Veja como funciona o código acima executando cada passo separadamente, | ||
| + | |||
| + | <code rsplus| Entendendo o código> | ||
| + | nrow(pop) | ||
| + | pop[nrow(pop), | ||
| + | matCory %*% pop[nrow(pop), | ||
| + | t(matCory %*% pop[nrow(pop), | ||
| + | rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | </ | ||
| + | |||
| + | Podemos fazer mais algumas multiplicações, | ||
| + | |||
| + | <code rsplus| Repetição> | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | pop <- rbind(pop, t(matCory %*% pop[nrow(pop), | ||
| + | ## ... | ||
| + | </ | ||
| + | |||
| + | Vamos agora nomear essas linhas usando a função '' | ||
| + | |||
| + | <code rsplus| Nomeando linhas> | ||
| + | rownames(pop) <- paste(" | ||
| + | </ | ||
| + | |||
| + | A função paste junta caracteres de dois vetores com os princípios da equivalência de posição e ciclagem, próprios das operações com vetores. Caso não tenha entendido o código acima, faça a separação de cada passo e veja a documentação das funções. Esse é um procedimento básico para entender códigos quando estamos iniciando no aprendizado de uma linguagem computacional. | ||
| + | |||
| + | |||
| + | Por fim, vamos olhar esses dados em um gráfico no objeto '' | ||
| + | |||
| + | <code rsplus| Grafico de matriz> | ||
| + | matplot(x = 0: | ||
| + | legend(" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 90%> | ||
| + | |||
| + | **__Modelos Matriciais de Dinâmica Populacional__** | ||
| + | |||
| + | Com um pouco mais de álgebra linear você pode obter muito mais informações sobre características da população biológica, apenas a partir das informações intrínsecas da matriz de transição (autovalores e autovetores). Por exemplo, a taxa de crescimento (λ) da população é o primeiro autovalor da matriz de transição, | ||
| + | |||
| + | |||
| + | <code rsplus| Autovalores da matriz> | ||
| + | eigen(matCory) | ||
| + | </ | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Matrix de comunidade ==== | ||
| + | |||
| + | |||
| + | Um formato de dados clássico em ecologia de comunidades é o de espécies por localidade, como a ocorrência ou a contagem de indivíduos. Já usamos a função '' | ||
| + | |||
| + | |||
| + | <code rsplus| Matriz caixeta> | ||
| + | str(caixeta) | ||
| + | caixTable <- table(caixeta$especie, | ||
| + | str(caixTable) | ||
| + | class(caixTable) | ||
| + | caixTable[," | ||
| + | caixMatrix <- as.matrix(caixTable) | ||
| + | str(caixMatrix) | ||
| + | identical(caixMatrix, | ||
| + | class(caixMatrix) | ||
| + | </ | ||
| + | |||
| + | Apesar de parecer que a coerção do objeto '' | ||
| + | |||
| + | |||
| + | Vamos agora fazer a manipulação desses dados para saber quantos indivíduos e espécies temos na localidade '' | ||
| + | |||
| + | <code rsplus| Operando caixeta> | ||
| + | caixMatrix[caixTable > 0 ] <- 1 | ||
| + | head(caixTable) | ||
| + | head(caixMatrix) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Agora podemos contar a coluna '' | ||
| + | |||
| + | <code resplus| Operando jureia > | ||
| + | sum(caixTable[, | ||
| + | sum(caixMatrix[, | ||
| + | </ | ||
| + | |||
| + | Poderíamos usar a função '' | ||
| + | |||
| + | |||
| + | <code resplus| Apply em matriz > | ||
| + | apply(caixTable, | ||
| + | apply(caixMatrix, | ||
| + | </ | ||
| + | |||
| + | ===== Combinando Dados Tabulares ==== | ||
| + | |||
| + | É comum termos informações que estão em formato de dados tabulares e precisam ser agrupadas com outro conjunto de dados. Vamos olhar algumas das ferramentas para fazer isso. | ||
| + | |||
| + | |||
| + | === Combinando colunas ou linhas === | ||
| + | |||
| + | As funções '' | ||
| + | |||
| + | <code rsplus| Combinando matrizes> | ||
| + | trapa <- read.table(" | ||
| + | str(trapa) | ||
| + | |||
| + | trapaNome <- read.table(" | ||
| + | str(trapaNome) | ||
| + | |||
| + | trapaNome | ||
| + | trapa | ||
| + | |||
| + | rbind(trapa, | ||
| + | trapabind <- cbind(trapa, | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Outras formas de combinar ==== | ||
| + | |||
| + | Quando colunas ou linhas não podem ser combinadas diretamente, | ||
| + | |||
| + | <code rsplus| Merge> | ||
| + | |||
| + | ## merge | ||
| + | |||
| + | merge(trapa, | ||
| + | trapa$codinome | ||
| + | trapaNome$codinome | ||
| + | |||
| + | merge(trapa, | ||
| + | trapa$codinome[2] <- trapaNome$codinome[3] | ||
| + | trapa$codinome | ||
| + | merge(trapa, | ||
| + | |||
| + | |||
| + | ## match | ||
| + | |||
| + | (matchtrap <- match(trapa$codinome, | ||
| + | trapaNome[matchtrap, | ||
| + | trapa$nome <- trapaNome[matchtrap, | ||
| + | trapa | ||
| + | |||
| + | </ | ||
| + | ===== Array ===== | ||
| + | |||
| + | O objeto '' | ||
| + | |||
| + | |||
| + | <code rsplus| Array> | ||
| + | class(pop) | ||
| + | </ | ||
| + | |||
| + | A classe é '' | ||
| + | |||
| + | Vamos avaliar um objeto dessa classe chamado '' | ||
| + | |||
| + | |||
| + | A função '' | ||
| + | |||
| + | <code rsplus| Datasets> | ||
| + | search() | ||
| + | ls(" | ||
| + | ls(" | ||
| + | </ | ||
| + | |||
| + | Isso significa que esse objeto está disponível para uso sem a necessidade de carregá-lo. Vamos investigar alguns atributos dele: | ||
| + | |||
| + | <code rsplus| Titanic> | ||
| + | is.array(Titanic) | ||
| + | dim(Titanic) | ||
| + | dimnames(Titanic) | ||
| + | </ | ||
| + | |||
| + | Um tanto mais complicado de visualizar os dados do que uma planilha. Imagine os quatro níveis de '' | ||
| + | |||
| + | <code rsplus|Estrutura array> | ||
| + | str(Titanic) | ||
| + | Titanic | ||
| + | </ | ||
| + | |||
| + | Essa estrutura permite operar qualquer dimensão, ou mesmo algumas dimensões ao mesmo tempo. Vamos usar o '' | ||
| + | |||
| + | Será que crianças e adultos tiveram a mesma proporção de vítimas? | ||
| + | |||
| + | <code rsplus| Array apply> | ||
| + | apply(Titanic, | ||
| + | </ | ||
| + | |||
| + | Será que a proporção de vítimas entre homens e mulheres foi similar? | ||
| + | |||
| + | <code rsplus| Array apply II> | ||
| + | apply(Titanic, | ||
| + | </ | ||
| + | |||
| + | E entre os passageiros de diferentes classes? | ||
| + | |||
| + | <code rsplus| Array apply III> | ||
| + | apply(Titanic, | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | **__Mistério do Titanic__**: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Os grupos com maior sobrevivência no desastre do Titanic foram as mulheres e crianças da primeira classe. Analisando dados de múltiplos acidentes marinhos o artigo [[https:// | ||
| + | </ | ||
| + | |||
| + | ====== Listas ====== | ||
| + | |||
| + | Listas são os objetos mais versáteis para armazenar informação no R. Apesar de ter uma única dimensão, suas posições comportam qualquer outra classe de objeto que vimos até então. Normalmente os objetos mais complexos no R, como por exemplo resultados de modelos estatísticos, | ||
| + | Vamos criar a nossa primeira lista com alguns objetos desse tutorial: | ||
| + | |||
| + | <code rsplus| Criando listas> | ||
| + | minhaLista <- list(vectorNum = num, dfTrapa = trapalhoes, matPop = pop, arrayTit = Titanic) | ||
| + | str(minhaLista) | ||
| + | </ | ||
| + | |||
| + | A indexação da lista é um misto das classes de objetos que vimos anteriormente. Na sua primeira dimensão aceita tanto o nome com '' | ||
| + | |||
| + | <code rsplus| Indexando listas> | ||
| + | minhaLista <- list(vectorNum = num, dfTrapa = trapalhoes, matPop = pop, arrayTit = Titanic) | ||
| + | str(minhaLista) | ||
| + | minhaLista$dfTrapa | ||
| + | minhaLista[[3]] | ||
| + | minhaLista[[" | ||
| + | </ | ||
| + | |||
| + | Os elementos de cada posição podem ser acessados usando as indexações correspondentes a cada classe! | ||
| + | |||
| + | <code rsplus| Niveis de indexação> | ||
| + | minhaLista$dfTrapa[, | ||
| + | minhaLista[[3]][1, | ||
| + | minhaLista[[" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | Lembre-se sempre de olhar o '' | ||
| + | |||
| + | |||
| + | </ | ||
| + | ====== Um Exemplo ====== | ||
| + | |||
| + | No vídeo abaixo apresento um exemplo de manipulação de dados de um estudo sobre dinâmica de população de uma espécie de árvore (//Guapira opposita//) da floresta atlântica, utilizando matrizes e arrays. | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | </ | ||