R – tabelas (“data frames”)

Este artigo mostra algumas operações bastante úteis com tabelas (“data frames”) no R, que possibilitam juntar tabelas ou resumir os dados de forma eficiente. Para maior clareza os exemplos abaixo usam dados criados manualmente, mas na prática os dados são obviamente lidos de algum arquivo.

(Alerta: por algum motivo a minha formatação do código abaixo tem se perdido frequentemente.)

Mudando o formato das tabelas

Criando tabela para exemplo

Criando tabela em formato “long” para exemplo:

data <- data.table(name = c("Adam", "Betty", "Carl",
                            "Adam", "Betty", "Carl",
                            "Adam", "Betty", "Carl"),  
                   exam = c("exam1", "exam1", "exam1",  
                            "exam2", "exam2", "exam2",   
                            "exam3", "exam3", "exam3"),  
                   grade = c(10.0, 8.4, 6.5,
                              9.8, 8.0, 5.6, 
                              9.7, 8.8, 4.5)) 

Tabela em formato “long” criada:

  name  exam  grade
1 Adam  exam1  10.0
2 Betty exam1   8.4
3 Carl  exam1   6.5
4 Adam  exam2   9.8
5 Betty exam2   8.0
6 Carl  exam2   5.6
7 Adam  exam3   9.7
8 Betty exam3   8.8
9 Carl  exam3   4.5

Muda formato da tabela de “long” para “wide”

Mudando para formato “wide”:

newdata <- reshape(data = data, idvar = "name", timevar = "exam", direction = "wide")

A tabela fica assim:


  name  grade.exam1 grade.exam2 grade.exam3
1 Adam         10.0         9.8         9.7
2 Betty         8.4         8.0         8.8
3 Carl          6.5         5.6         4.5

Muda o formato da tabela de “wide” para “long”

# muda o formato da tabela
olddata <- reshape(data = newdata, direction = "long")

# muda o nome das colunas para ficar como antes
colnames(olddata) <- c("name", "exam", "grade")

# muda os nome das linhas para ficar como antes
rownames(olddata) <- 1:9

A tabela volta a ficar como antes:

  name  exam  grade
1 Adam  exam1  10.0
2 Betty exam1   8.4
3 Carl  exam1   6.5
4 Adam  exam2   9.8
5 Betty exam2   8.0
6 Carl  exam2   5.6
7 Adam  exam3   9.7
8 Betty exam3   8.8
9 Carl  exam3   4.5

 Combinando tabelas (“merge”)

Criado tabelas para exemplo

Criando duas tabelas, uma com propriedades de um feixe de partículas (“beams”) e outra com algum tipo de medida ou resultado para cada feixe (“measurements”) incluindo repetições:

beams <- data.frame(
              particle = c("proton", "He-4", "C-12", "O-16"),
              Z = c(1, 2, 6, 8))
measurements <- data.frame(
                   particle = c("proton", "proton", "proton",
                                "He-4", "He-4", "He-4",
                                "C-12", "C-12", "C-12",
                                "O-16", "O-16", "O-16"),
                   values = c(1.02, 1.03, 1.04,
                              2.01, 1.98, 2.02,
                              6.02, 5.99, 5.87,
                              8.15, 7.89, 7.99))

Logicamente na vida real os dados são lidos de arquivos.

Tabela “beams”:

  name   Z
1 proton 1
2 He-4   2
3 C-12   6
4 O-16   8

Tabela “measurements”:

   particle values
1  proton     1.02
2  proton     1.03
3  proton     1.04
4  He-4       2.01
5  He-4       1.98
6  He-4       2.02
7  C-12       6.02
8  C-12       5.99
9  C-12       5.87
10 O-16       8.15
11 O-16       7.89
12 O-16       7.99

Combinado as tabelas:

 resultado <- merge(x = measurements, y = beams)

A função “merge” combina as tabelas usando o nome da coluna presente nas duas tabelas (“particle”), ou seja, neste caso adicionando as informações sobre os feixes na tabela de resultados. Quando não há ambiguidade o resultado é:

  particle values Z
1 C-12       6.02 6
2 C-12       5.99 6
3 C-12       5.87 6
4 He-4       2.01 2
5 He-4       1.98 2
6 He-4       2.02 2
7 O-16       8.15 8
8 O-16       7.89 8
9 O-16       7.99 8
10 proton    1.02 1
11 proton    1.03 1
12 proton    1.04 1

Se as tabelas não tiverem colunas com nomes em comum, é preciso especificar quais colunas identificam cada “indivíduo” nas tabelas:

resultado <- merge(x = measurements
                   y = beams, 
                   by.x = "particle", 
                   by.y = "name")

Agregando resultados (“aggregate”)

A função aggregate permite, por exemplo, calcular a média dos resultados para cada feixe:

media <- aggregate(values ~ particle, data = resultado, FUN = mean)

O resultado é:

  particle values
1 C-12   5.960000
2 He-4   2.003333
3 O-16   8.010000
4 proton 1.030000

Sobre Eduardo Yukihara

Pesquisador | Professor | Autor
Esse post foi publicado em Prática e ferramentas e marcado , , . Guardar link permanente.

Uma resposta para R – tabelas (“data frames”)

  1. Antonio Barradas disse:

    Eu chamo-me Antonio Barradas e tenho algumas dificuldades em Funcionar com R. Sobretudo Juntar duas tabelas entre dados ambientais e dados biologicos anuais. Voces poderiam ajudar nesse sentido? Agradecia Barradas Date: Mon, 25 May 2015 12:00:56 +0000 To: barradantonio@hotmail.com

    Curtir

Dê também a sua contribuição ou sugestão.