[R-br] RES: Dúvida ao juntar duas bases de dados

Mauro Sznelwar sznelwar em uol.com.br
Segunda Maio 18 12:05:36 BRT 2015


Tem o arquivo para rodar?

 

 

 

Oi pessoal, consegui resolver aqui. O Diego me ajudou. 

 

O problema que estava enfrentando é que existia a repetição de IDs na minha base de dados. Por exemplo, o ID 2 se repetia 15 vezes. A solução foi criar um novo id que tenha a informação do antigo id e a identificação da unidade amostral dentro daquele id. Feito isso, foi utilizado o merge. 

 

 

Basicamente foi feito o seguinte, parte da minha base de dados era desse jeito:

 

 

> head(dados)

  id var1 var2 var3     var4 var5       var6 var7       var8 var9

1  1   RJ   99    1 27.66667    2 15/12/2004    1 15/03/2005  358

2  2   RJ    1    1 35.32500    1 13/07/2001    1 27/02/2002  645

3  2   RJ    1    1 35.32500    1 13/07/2001    1 06/11/2007   73

4  2   RJ    1    1 35.32500    1 13/07/2001    1 03/12/2007  162

5  2   RJ    1    1 35.32500    1 13/07/2001    1 02/07/2002  546

6  2   RJ    1    1 35.32500    1 13/07/2001    1 06/12/2002  542

 

 

> head(dados1)

  id    var10

1  1 3.031408

2  2 4.710963

3  2 4.262451

4  2 5.334454

5  2 4.718502

6  2 4.413300

 

 

> dim(dados)

[1] 2074   10

 

> dim(dados1)

[1] 1782    2

 

O que queria é juntar essas duas bases, só que são de dimensões diferentes. O grande problema seria na repetição de IDs, pois somente o merge não ajudaria. Então a solução do Diego foi fazer o seguinte:

 

n.dados <- numeric(dim(dados)[1])

n.dados[1] <- 1

for(i in 2:dim(dados)[1]) {

  n.dados[i] <- ifelse(test = dados[(i - 1), 'id'] == dados[i, 'id'], yes = n.dados[i - 1] + 1, no = 1)

}

 

n.dados1 <- numeric(dim(dados1)[1])

n.dados1[1] <- 1

for(i in 2:dim(dados1)[1]) {

  n.dados1[i] <- ifelse(test = dados1[(i - 1), 'id'] == dados1[i, 'id'], yes = n.dados1[i - 1] + 1, no = 1)

}

 

ID <- paste0(formatC(dados[, 'id'], width = 4, flag = '0'), formatC(n.dados, width = 2, flag = '0'))

DADOS <- cbind(ID, dados)

 

ID <- paste0(formatC(dados1[, 'id'], width = 4, flag = '0'), formatC(n.dados1, width = 2, flag = '0'))

DADOS1 <- cbind(ID, dados1)

 

 

 

 

Rodando o script acima, a base de dados ficou da seguinte forma:

 

> head(DADOS)

      ID id var1 var2 var3     var4 var5       var6 var7       var8 var9

1 000101  1   RJ   99    1 27.66667    2 15/12/2004    1 15/03/2005  358

2 000201  2   RJ    1    1 35.32500    1 13/07/2001    1 27/02/2002  645

3 000202  2   RJ    1    1 35.32500    1 13/07/2001    1 06/11/2007   73

4 000203  2   RJ    1    1 35.32500    1 13/07/2001    1 03/12/2007  162

5 000204  2   RJ    1    1 35.32500    1 13/07/2001    1 02/07/2002  546

6 000205  2   RJ    1    1 35.32500    1 13/07/2001    1 06/12/2002  542

 

 

> head(DADOS1)

      ID id    var10

1 000101  1 3.031408

2 000201  2 4.710963

3 000202  2 4.262451

4 000203  2 5.334454

5 000204  2 4.718502

6 000205  2 4.413300

 

 

Utilizando o merge:

 

k<-merge(x = DADOS, y = DADOS1, by = 'ID', all.y = TRUE)

 

head(k)

      ID id.x var1 var2 var3     var4 var5       var6 var7       var8 var9 id.y    var10

1 000101    1   RJ   99    1 27.66667    2 15/12/2004    1 15/03/2005  358    1 3.031408

2 000201    2   RJ    1    1 35.32500    1 13/07/2001    1 27/02/2002  645    2 4.710963

3 000202    2   RJ    1    1 35.32500    1 13/07/2001    1 06/11/2007   73    2 4.262451

4 000203    2   RJ    1    1 35.32500    1 13/07/2001    1 03/12/2007  162    2 5.334454

5 000204    2   RJ    1    1 35.32500    1 13/07/2001    1 02/07/2002  546    2 4.718502

6 000205    2   RJ    1    1 35.32500    1 13/07/2001    1 06/12/2002  542    2 4.413300

 

 

 

 

 

Agradeço à todos pela ajuda e atenção.

 

 

Grande abraço e ótima semana,

 

 

 

Victor Eduardo

 

Em 16 de maio de 2015 14:53, Paulo Abreu <abreups em me.com> escreveu:

Victor,

 

Manda seu código que fica mais fácil da gente ver o que pode ter dado errado.

 

Em 16/05/2015, à(s) 14:38, Paulo Dick <paulopcdick em gmail.com> escreveu:

 

Olá Victor,

Veja se os valores no id nas duas está no mesmo formato, talvez um maiúsculo ou minúsculo diferente pode fazer com que ele não case as informações direito.


Em sábado, 16 de maio de 2015, Victor Eduardo <victorduca08 em gmail.com> escreveu:

Oi Diego, eu tentei isso, e ele simplesmente aumenta o número de linhas. Sobe para mais de 20 mil linhas na hora do merge

 

 

 

Em 16 de maio de 2015 13:32, Diego Miro <d.miro1089 em gmail.com> escreveu:

Victor, tente usar o argumento (all.x = TRUE) dentro do merge. Dessa forma você estará fazendo um Left Join. 

 

Ele vai retornar a tabela dados inteira, com todos os seus registros e apenas os registros de dados1 que tenham um id pertencente a coluna id de dados. Caso não encontre o id em dados, retorna NA em dados1.

 

merge(x = dados, y = dados1, by = 'Id', all.x = TRUE) 

 

Em 16 de maio de 2015 12:00, Fernando Antonio de souza <nandodesouza em gmail.com> escreveu:

Veja a função merge()

Em 16/05/2015 11:35, "Victor Eduardo" <victorduca08 em gmail.com> escreveu:

Bom dia, pessoal!

 

Estou com um problema na hora de juntar a base de dados. Estou com duas bases com as seguintes dimensões:

> dim(dados)

[1] 2056   11

 

 

> dim(dados1)

[1] 1782    2

 

 

 

Ambas as bases possuem uma variável chamada "id". O que queria é formar um subconjunto a partir de dados1 baseado nesses ids, ou seja, aproveitaria as variáveis da base "dados" com as variáveis em "dados1".


Eu tentei com o merge e não está dando certo. Existe alguma função que faça isso?

 

 

 

Abraços e ótima semana!

 

_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.


_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

 


_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

 



-- 

 

Paulo Dick

Estatístico

Mestrando em Epidemiologia em Saúde Pública

Tel.: (55 21) 99591-2716


_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

 


_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

 



---
Este email foi escaneado pelo Avast antivírus.
http://www.avast.com
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150518/6c35f2b5/attachment.html>


Mais detalhes sobre a lista de discussão R-br