Unindo tabelas no R (Join/Merge)

Quem trabalha muito com bases de dados com certeza já usou algum comando com o nome merge ou os famosos joins. Esse eu acho que é de longe o tipo de comando que eu mais uso quando trabalho com base de dados. Como você nunca tem todas as informações possíveis em uma tabela, você sempre vai precisar enriquecer suas bases com informações de outros locais. 

No exemplo abaixo, temos a tabela_A com as informações de id, nome e idade dos clientes de uma loja. Na tabela_B, temos a informação de id e UF destes mesmos clientes. Vamos utilizar a função merge() para trazer as informações de UF da tabela_B para tabela_A. Nossa nova tabela se chamará tabela_merge:

# constroi tabela A
tabela_A = data.frame(c("AA125", "BB235","CC355","DE354","QQ111","XX000"),
c("Andre", "Marcos", "Fernanda", "Julia", "Maria", "Jose"),
c(21,28,29,35,22,39))
colnames(tabela_A) = c("id","Nome","Idade")

# constroi tabela B
tabela_B = data.frame(c("AA125", "BB235","CC355","DE354","QQ111","XX000"),
c("BA", "RJ", "RJ", "RS", "SP", "MG"))
colnames(tabela_B) = c("id", "UF")

# une as duas tabelas pelo campo id
tabela_merge = merge(tabela_A, tabela_B, by="id")
# analisa o output
View(tabela_merge)
# ou
head(tabela_merge)
Captura de Tela 2018-05-27 às 15.01.30

tabela_A

Captura de Tela 2018-05-27 às 15.01.37

tabela_B

Captura de Tela 2018-05-27 às 15.13.03

tabela_merge

Note que nós simplesmente agregamos as informações da tabela_B na tabela_A.

Caso você queira unir por dois campos, basta incluir todas as variáveis em comum após o comando by:  merge(tabela_A, tabela_B, by = c(variavel_1, variavel_2, variavel_3, …). No exemplo abaixo, não temos uma chave única por cliente. Por isso, para garantir que estamos trazendo as informações corretas da tabela_B, vamos unir utilizando os campos nome e tel:

# constroi tabela A
tabela_A = data.frame(c("Andre", "Marcos", "Fernanda", "Julia", "Maria"),
c(7596565669, 2198979789, 516556498, 116458986, 316587989),
c(21,28,29,35,30),
c(0,0,1,1,2))
colnames(tabela_A) = c("Nome","Tel","Idade","N de Filhos")

# constroi tabela B
tabela_B = data.frame(c("Andre", "Marcos", "Fernanda", "Julia", "Maria"),
c(7596565669, 2198979789, 516556498, 116458986, 316587989),
c("Analista","Analista","Coordenador","Gerente","Gerente"),
c("S","S","N","S","S"))
colnames(tabela_B) = c("Nome","Tel","Cargo","Possui Carro")

# une as duas tabelas pelo campo id
tabela_merge = merge(tabela_A, tabela_B, by=c("Nome", "Tel"))
Captura de Tela 2018-05-27 às 15.21.44

tabela_A

Captura de Tela 2018-05-27 às 15.21.51

tabela_B

Captura de Tela 2018-05-27 às 15.21.59

tabela_merge

Vale lembrar que esse comando (merge) é semelhante ao inner join do SAS, ele trará somente as informações de intersecção das duas tabelas. Veja, por exemplo, quando pegamos nosso primeiro exemplo e nossa tabela_B não tem a informação para o id = BB235:

# constroi tabela A
tabela_A = data.frame(c("AA125", "BB235","CC355","DE354","QQ111","XX000"),
 c("Andre", "Marcos", "Fernanda", "Julia", "Maria", "Jose"),
 c(21,28,29,35,22,39))
colnames(tabela_A) =c("id","Nome","Idade")

# constroi tabela B
tabela_B = data.frame(c("AA125","CC355","DE354","QQ111","XX000"),
 c("BA", "RJ", "RS", "SP", "MG"))
colnames(tabela_B) = c("id", "UF")

# une as duas tabelas pelo campo id
tabela_merge = merge(tabela_A, tabela_B, by="id")
Captura de Tela 2018-05-27 às 15.01.30

tabela_A

Captura de Tela 2018-05-27 às 15.09.26

tabela_B

Captura de Tela 2018-05-27 às 15.09.32

tabela_merge

E se você tiver muitas colunas na tabela_B e quiser trazer só uma? Isto é, você quer fazer algo semelhante ao left join do SAS e SQL. Neste caso, complemente o merge declarando também all.x=TRUE:

# constroi tabela A
tabela_A = data.frame(c("AA125", "BB235","CC355","DE354","QQ111","XX000"),
c("Andre", "Marcos", "Fernanda", "Julia", "Maria", "Jose"),
c(21,28,29,35,22,39))
colnames(tabela_A) = c("id","Nome","Idade")

# constroi tabela B
tabela_B = data.frame(c("AA125","CC355","DE354","QQ111"),
c("BA", "RJ", "RS", "SP"),
c("Analista", "Analista", "Gerente", "Coordenador"),
c(0,0,1,2))
colnames(tabela_B) = c("id", "UF", "Cargo", "N de Filhos")

tabela_merge = merge(tabela_A, tabela_B, by="id", all.x=TRUE)
Captura de Tela 2018-05-27 às 15.33.37

tabela_A

Captura de Tela 2018-05-27 às 15.33.46

tabela_B

Captura de Tela 2018-05-27 às 15.33.26

tabela_merge

Como lição de casa, tente substituir all.x = TRUE por all.y = TRUE e por all = TRUE.

Mas e se você só quiser empilhar – colocar uma em cima da outra – as duas tabelas? Neste caso, utilize o rbind():

# constroi tabela A
tabela_A = data.frame(c("Andre", "Marcos", "Fernanda", "Julia", "Maria"),
c(7596565669, 2198979789, 516556498, 116458986, 316587989),
c(21,28,29,35,30),
c(0,0,1,1,2))
colnames(tabela_A) = c("Nome","Tel","Idade","N de Filhos")

# constroi tabela B
tabela_B = data.frame(c("Fabio", "Giulia", "Talita", "Fernando"),
c(7596565669, 2198979789, 516556498, 116458986),
c(20,38,19,32),
c(1,0,2,1))
colnames(tabela_B) = c("Nome","Tel","Idade","N de Filhos")

# empilha as tabelas
tabela_empilhada = rbind(tabela_A,tabela_B)
Captura de Tela 2018-05-27 às 15.26.11

tabela_A

Captura de Tela 2018-05-27 às 15.26.20

tabela_B

Captura de Tela 2018-05-27 às 15.26.27

tabela_empilhada

Agora você pode usar seu R quase como um SAS ou SQL.

Qualquer dúvida, deixe um comentário!

Bons estudos!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s