[R-br] Dúvida ao juntar duas bases de dados
Victor Eduardo
victorduca08 em gmail.com
Sábado Maio 16 16:03:21 BRT 2015
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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150516/d3f8f1a3/attachment.html>
Mais detalhes sobre a lista de discussão R-br