Tabelas em R

Desenho Experimental e Análise Avançada de Dados Ecológicos

João O. Santos

ISPA

Hoje: Uma Tabela

Antes de analisar, precisamos de saber o que temos na mão.

Uma Linha, Uma Unidade

peixe · tanque · recife · quadrado · visita

O que representa cada linha desta tabela?

Uma Coluna, Uma Variável

especie · comprimento_cm · tanque

Cada coluna guarda uma variável. Cada linha guarda uma unidade.

Criar Uma Tabela

peixes <- data.frame(
  id = 1:6,
  tanque = c("A", "A", "A", "B", "B", "B"),
  especie = c("sargo", "sargo", "robalo", "robalo", "sargo", "robalo"),
  comprimento_cm = c(12.1, 14.3, 9.8, 16.0, 11.5, 13.2)
)

Todos os vectores têm seis elementos. Se não tivessem, o R não nos avisaria da mesma forma.

Primeiro: Inspeccionar

dim(peixes)
[1] 6 4
names(peixes)
[1] "id"             "tanque"         "especie"        "comprimento_cm"
head(peixes, 3)
id tanque especie comprimento_cm
1 A sargo 12.1
2 A sargo 14.3
3 A robalo 9.8

linhas × colunas → nomes → primeiras linhas

Ler a Estrutura

str(peixes)
'data.frame':   6 obs. of  4 variables:
 $ id            : int  1 2 3 4 5 6
 $ tanque        : chr  "A" "A" "A" "B" ...
 $ especie       : chr  "sargo" "sargo" "robalo" "robalo" ...
 $ comprimento_cm: num  12.1 14.3 9.8 16 11.5 13.2

str() mostra as classes. Um número guardado como texto estraga qualquer média.

Seleccionar Uma Coluna

peixes$comprimento_cm
[1] 12.1 14.3  9.8 16.0 11.5 13.2

tabela$coluna devolve um vector.

Seleccionar Linhas e Colunas

peixes[peixes$tanque == "A", c("id", "comprimento_cm")]
id comprimento_cm
1 12.1
2 14.3
3 9.8

[linhas, colunas]. A vírgula separa as duas decisões.

Uma Condição

peixes$comprimento_cm > 12
[1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE

TRUE · FALSE · um valor por linha

Filtrar

peixes[peixes$comprimento_cm > 12, ]
id tanque especie comprimento_cm
1 1 A sargo 12.1
2 2 A sargo 14.3
4 4 B robalo 16.0
6 6 B robalo 13.2

Antes de filtrar, perguntem quantas linhas esperam obter.

Criar Uma Coluna

peixes$massa_g <- round(0.012 * peixes$comprimento_cm^3, 0)
head(peixes, 3)
id tanque especie comprimento_cm massa_g
1 A sargo 12.1 21
2 A sargo 14.3 35
3 A robalo 9.8 11

A fórmula é ilustrativa. O que importa é a coluna nova ficar ligada à mesma unidade.

Verificar Cada Passo

nrow(peixes)
[1] 6
ncol(peixes)
[1] 5
summary(peixes$massa_g)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  11.00   18.75   24.50   27.00   33.25   49.00 

mudou o que devia mudar?

Contar Antes de Concluir

table(peixes$tanque, peixes$especie)
   
    robalo sargo
  A      1     2
  B      2     1

Um número por célula. Não um número por réplica, a menos que cada linha seja uma réplica.

Juntar Tabelas

tanques <- data.frame(
  tanque = c("A", "B"),
  temperatura_C = c(18.5, 21.0)
)
merge(peixes, tanques, by = "tanque")
tanque id especie comprimento_cm massa_g temperatura_C
A 1 sargo 12.1 21 18.5
A 2 sargo 14.3 35 18.5
A 3 robalo 9.8 11 18.5
B 4 robalo 16.0 49 21.0
B 5 sargo 11.5 18 21.0
B 6 robalo 13.2 28 21.0

A chave é o identificador. A posição das linhas não junta nada.

Posição Não É Chave

mesma ordem ≠ mesma unidade

Se duas tabelas têm as mesmas linhas por acaso, o R não sabe que são o mesmo objecto.

Exercício Um

20 minutos · pares

Usem water, a tabela da qualidade da água:

water <- read.csv("../../data/WaterQualityTesting.csv", check.names = FALSE)
colnames(water) <- c("Sample", "pH", "Temp", "NTU", "Oxygen", "Conductivity")
  1. Usem dim(), names() e str().
  2. Seleccionem Sample e Oxygen.
  3. Seleccionem as linhas com Oxygen > 8.
  4. Criem uma coluna nova, por exemplo Oxygen em percentagem de uma referência.
  5. Escrevam uma frase: o que representa uma linha?

Exercício Dois

15 minutos · individual, depois comparem

Com peixes:

  1. contem os peixes por tanque e por espécie;
  2. juntem tanques pela chave tanque;
  3. verifiquem que a tabela resultante tem seis linhas.

Se o número de linhas mudar, parem e encontrem a razão antes de continuar.

Quando a Tabela Engana

valores em falta · espécies escritas de duas maneiras · linhas duplicadas

Estes problemas ficam para a limpeza de dados. Hoje basta reconhecê-los.

Antes de Continuar

  • A tabela tem a forma que esperava?
  • Cada linha continua a ser a mesma unidade?
  • Os tipos (num, chr, factor) estão certos?

Próximo Passo

Ler um ficheiro sem perder a origem

Introdução aos data.frames

Importação e Exportação de Dados

Voltar às aulas DEAADE