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
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
CurtirCurtir