
Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex. Verifiquei que erros de digitação não são captados pelo SoundexBR. Exemplo: ?MARIA e MARIA, PE8DRO e PEDRO. Será que seria tranquilo para você implementar algumas coisas? Estou enviando um script que fiz com teste para alguns caracteres. Desde já muito obrigada. Abs Fátima soundexBR<-function(termo){ termo<-toupper(termo) # 1. Retire toda pontuação da palavra; termo<-gsub("[ÃÁÀÂÄ]","A",termo) termo<-gsub("[ÉÈÊ?Ë]","E",termo) termo<-gsub("[ÍÌÏÎI]","I",termo) termo<-gsub("[ÓÕÒÔÖ]","O",termo) termo<-gsub("[ÚÙÛÜU]","U",termo) termo<-gsub("Ç","C",termo) #1.a Substituir todas as letras duplas por uma única letra #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([A-Z])\\1", "\\1", termo) # 2. Fique com a primeira letra; N<-nchar(termo) # Modificação PT-BR (Coeli e Camargo) termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo) termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo) termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo) termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo) termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo) termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo) ############## Segunda Parte ####################### termo.1<-substr(termo,1,1) termo<-substr(termo,2,N) # 3. Mude todas as ocorrências das letras a seguir por '0' (zero): 'A','E','I','O','U','H','W','Y'; termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo) # 4. Mude as letras restantes de acordo com a tabela abaixo: # Número Letra # 1 'B','F','P','V' termo<-gsub("[B,F,P,V]",1,termo) # 2 'C','G','J','K', 'Q','S','X','Z' termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo) # 3 'D','T' termo<-gsub("[D,T]",3,termo) # 4 'L' termo<-gsub("L",4,termo) # 5 'M','N' termo<-gsub("[M,N]",5,termo) # 6 'R' termo<-gsub("R",6,termo) # 5. Remova todos os zeros da string resultante; termo<-gsub(0,"",termo) # Eliminar dois numeros iguais consecutivos por um único numero #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([0-9])\\1", "\\1", termo) # Remontar termo<-paste(termo.1,termo,sep="") # 6. Preencha a string resultante com zeros à direita e retorne desta forma: #<letra maiuscula><digito><digito><digito> termo<-paste(termo,"0000",sep="") termo<-substr(termo,1,4) return(termo) } soundexBR("termo") soundexBR("terno") nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) library(RecordLinkage) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Ponto de interrogação nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com o ? no início ############################################################################### #Barras inclinadas / nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com a barra inclinada #Barras inclinadas \ nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT")) nomea #O R rejeita a \ #Parênteses ( nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o parênteses depois do nome #Dois pontos e ponto e vírgula nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o : e ; depois do nome #Dólar e ponto nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT.")) nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Idem #Números nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com números

Fátima, dá pra fazer isso, só não sei ainda se incorporando uma solução ad-hoc é a melhor coisa a ser feita na função original. Preciso pensar um pouco mais sobre as implicações dessa alteração para as bases de dados que a função foi inicialmente implementada. Uma forma de você resolver isso "bypass" é passando o comando abaixo nas variáveis que contêm nomes antes de aplicar o soundex. Por exemplo: nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
nomea nome nome2 1 GER?D GERD 2 HARTMUT HARTMUT 3 RALF RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
soundexBR(nomea$nome) [1] "J-6?3" "A-635" "R-410" "S-315" "R-163"
soundexBR(nomea$nome2) [1] "J-630" "A-635" "R-410" "S-315" "R-163"
Fátima, o problema é que se o erro de entrada de dados estiver na primeira letra do nome, e se o caracter errado estiver ocupando o lugar de uma letra (por ex. % ao invés de H), a string gerada ficará incorreta. Isso pode ser um problema. A solução que eu te passei apenas retira os caracteres estranhos dos nomes, mas não "advinha" qual letra deveria estar no lugar, percebe? A boa notícia é que se sua base de dados tiver muitos erros de entrada, nada te garante também que um nome, aparentemente correto, digo, com apenas letras (Naria ao invés de Maria), não esteja sendo codificado de forma errada ("N-600", "M-600"). Daniel 2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex. Verifiquei que erros de digitação não são captados pelo SoundexBR. Exemplo: ?MARIA e MARIA, PE8DRO e PEDRO. Será que seria tranquilo para você implementar algumas coisas? Estou enviando um script que fiz com teste para alguns caracteres. Desde já muito obrigada. Abs Fátima soundexBR<-function(termo){ termo<-toupper(termo) # 1. Retire toda pontuação da palavra; termo<-gsub("[ÃÁÀÂÄ]","A",termo) termo<-gsub("[ÉÈÊ?Ë]","E",termo) termo<-gsub("[ÍÌÏÎI]","I",termo) termo<-gsub("[ÓÕÒÔÖ]","O",termo) termo<-gsub("[ÚÙÛÜU]","U",termo) termo<-gsub("Ç","C",termo) #1.a Substituir todas as letras duplas por uma única letra #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([A-Z])\\1", "\\1", termo) # 2. Fique com a primeira letra; N<-nchar(termo) # Modificação PT-BR (Coeli e Camargo) termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo) termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo) termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo) termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo) termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo) termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo) ############## Segunda Parte ####################### termo.1<-substr(termo,1,1) termo<-substr(termo,2,N) # 3. Mude todas as ocorrências das letras a seguir por '0' (zero): 'A','E','I','O','U','H','W','Y'; termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo) # 4. Mude as letras restantes de acordo com a tabela abaixo: # Número Letra # 1 'B','F','P','V' termo<-gsub("[B,F,P,V]",1,termo) # 2 'C','G','J','K', 'Q','S','X','Z' termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo) # 3 'D','T' termo<-gsub("[D,T]",3,termo) # 4 'L' termo<-gsub("L",4,termo) # 5 'M','N' termo<-gsub("[M,N]",5,termo) # 6 'R' termo<-gsub("R",6,termo) # 5. Remova todos os zeros da string resultante; termo<-gsub(0,"",termo) # Eliminar dois numeros iguais consecutivos por um único numero #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([0-9])\\1", "\\1", termo) # Remontar termo<-paste(termo.1,termo,sep="")
# 6. Preencha a string resultante com zeros à direita e retorne desta forma: #<letra maiuscula><digito><digito><digito> termo<-paste(termo,"0000",sep="") termo<-substr(termo,1,4) return(termo) }
soundexBR("termo") soundexBR("terno")
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) library(RecordLinkage) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Ponto de interrogação nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com o ? no início ############################################################################### #Barras inclinadas / nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com a barra inclinada #Barras inclinadas \ nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT")) nomea #O R rejeita a \ #Parênteses ( nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o parênteses depois do nome #Dois pontos e ponto e vírgula nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o : e ; depois do nome #Dólar e ponto nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT.")) nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Idem #Números nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com números
_______________________________________________ R-br mailing list R-br@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature} "Small steps toward a much better world"

Valeu, Daniel. Acho que, como falei com meus orientadores isso se resolve levanco os nomespara o excel. É que a gente queria ver se daria para fazer no R. Obrigada. Abs Em 17 de março de 2013 15:24, Daniel Marcelino <dmarcelino@live.com>escreveu:
Fátima, dá pra fazer isso, só não sei ainda se incorporando uma solução ad-hoc é a melhor coisa a ser feita na função original. Preciso pensar um pouco mais sobre as implicações dessa alteração para as bases de dados que a função foi inicialmente implementada. Uma forma de você resolver isso "bypass" é passando o comando abaixo nas variáveis que contêm nomes antes de aplicar o soundex. Por exemplo:
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT"))
nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
nomea nome nome2 1 GER?D GERD 2 HARTMUT HARTMUT 3 RALF RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
soundexBR(nomea$nome) [1] "J-6?3" "A-635" "R-410" "S-315" "R-163"
soundexBR(nomea$nome2) [1] "J-630" "A-635" "R-410" "S-315" "R-163"
Fátima, o problema é que se o erro de entrada de dados estiver na primeira letra do nome, e se o caracter errado estiver ocupando o lugar de uma letra (por ex. % ao invés de H), a string gerada ficará incorreta. Isso pode ser um problema. A solução que eu te passei apenas retira os caracteres estranhos dos nomes, mas não "advinha" qual letra deveria estar no lugar, percebe? A boa notícia é que se sua base de dados tiver muitos erros de entrada, nada te garante também que um nome, aparentemente correto, digo, com apenas letras (Naria ao invés de Maria), não esteja sendo codificado de forma errada ("N-600", "M-600").
Daniel
2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex. Verifiquei que erros de digitação não são captados pelo SoundexBR. Exemplo: ?MARIA e MARIA, PE8DRO e PEDRO. Será que seria tranquilo para você implementar algumas coisas? Estou enviando um script que fiz com teste para alguns caracteres. Desde já muito obrigada. Abs Fátima soundexBR<-function(termo){ termo<-toupper(termo) # 1. Retire toda pontuação da palavra; termo<-gsub("[ÃÁÀÂÄ]","A",termo) termo<-gsub("[ÉÈÊ?Ë]","E",termo) termo<-gsub("[ÍÌÏÎI]","I",termo) termo<-gsub("[ÓÕÒÔÖ]","O",termo) termo<-gsub("[ÚÙÛÜU]","U",termo) termo<-gsub("Ç","C",termo) #1.a Substituir todas as letras duplas por uma única letra #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([A-Z])\\1", "\\1", termo) # 2. Fique com a primeira letra; N<-nchar(termo) # Modificação PT-BR (Coeli e Camargo) termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo) termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo)
termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo)
termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo)
termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo)
termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo)
############## Segunda Parte ####################### termo.1<-substr(termo,1,1) termo<-substr(termo,2,N) # 3. Mude todas as ocorrências das letras a seguir por '0' (zero): 'A','E','I','O','U','H','W','Y'; termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo) # 4. Mude as letras restantes de acordo com a tabela abaixo: # Número Letra # 1 'B','F','P','V' termo<-gsub("[B,F,P,V]",1,termo) # 2 'C','G','J','K', 'Q','S','X','Z' termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo) # 3 'D','T' termo<-gsub("[D,T]",3,termo) # 4 'L' termo<-gsub("L",4,termo) # 5 'M','N' termo<-gsub("[M,N]",5,termo) # 6 'R' termo<-gsub("R",6,termo) # 5. Remova todos os zeros da string resultante; termo<-gsub(0,"",termo) # Eliminar dois numeros iguais consecutivos por um único numero #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([0-9])\\1", "\\1", termo) # Remontar termo<-paste(termo.1,termo,sep="")
# 6. Preencha a string resultante com zeros à direita e retorne desta forma: #<letra maiuscula><digito><digito><digito> termo<-paste(termo,"0000",sep="") termo<-substr(termo,1,4) return(termo) }
soundexBR("termo") soundexBR("terno")
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) library(RecordLinkage) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Ponto de interrogação nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com o ? no início
###############################################################################
#Barras inclinadas / nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com a barra inclinada #Barras inclinadas \ nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT")) nomea #O R rejeita a \ #Parênteses ( nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o parênteses depois do nome #Dois pontos e ponto e vírgula nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o : e ; depois do nome #Dólar e ponto nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT.")) nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Idem #Números
nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6"))
nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com números
_______________________________________________ R-br mailing list R-br@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature}
"Small steps toward a much better world" _______________________________________________ R-br mailing list R-br@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.

Dá pra fazer tudo tranquilamente. Inclusive, se você perceber que há muito erro por vício de digitação etc, você pode tentar implementar um pequeno dicionário de substituições e passar como função no R. Acabei de ver que a solução que eu te passei não corrige as barras "\". Para isso você teria que passar essa outra: nomea=data.frame(nome=c("?GER\\D","\\HART$MUT","R%ALF\\","STEFAN8","?ROBERT")) nomea$nome2<- gsub('[^A-z]', '', nomea$nome) nomea$nome2<- gsub('[^[:alnum:]]', '', nomea$nome)
nomea nome nome2 1 GER\\D GERD 2 \\HARTMUT HARTMUT 3 RALF\\ RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Valeu, Daniel. Acho que, como falei com meus orientadores isso se resolve levanco os nomespara o excel. É que a gente queria ver se daria para fazer no R. Obrigada. Abs
Em 17 de março de 2013 15:24, Daniel Marcelino <dmarcelino@live.com> escreveu:
Fátima, dá pra fazer isso, só não sei ainda se incorporando uma solução ad-hoc é a melhor coisa a ser feita na função original. Preciso pensar um pouco mais sobre as implicações dessa alteração para as bases de dados que a função foi inicialmente implementada. Uma forma de você resolver isso "bypass" é passando o comando abaixo nas variáveis que contêm nomes antes de aplicar o soundex. Por exemplo:
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT"))
nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
nomea nome nome2 1 GER?D GERD 2 HARTMUT HARTMUT 3 RALF RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
soundexBR(nomea$nome) [1] "J-6?3" "A-635" "R-410" "S-315" "R-163"
soundexBR(nomea$nome2) [1] "J-630" "A-635" "R-410" "S-315" "R-163"
Fátima, o problema é que se o erro de entrada de dados estiver na primeira letra do nome, e se o caracter errado estiver ocupando o lugar de uma letra (por ex. % ao invés de H), a string gerada ficará incorreta. Isso pode ser um problema. A solução que eu te passei apenas retira os caracteres estranhos dos nomes, mas não "advinha" qual letra deveria estar no lugar, percebe? A boa notícia é que se sua base de dados tiver muitos erros de entrada, nada te garante também que um nome, aparentemente correto, digo, com apenas letras (Naria ao invés de Maria), não esteja sendo codificado de forma errada ("N-600", "M-600").
Daniel
2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex. Verifiquei que erros de digitação não são captados pelo SoundexBR. Exemplo: ?MARIA e MARIA, PE8DRO e PEDRO. Será que seria tranquilo para você implementar algumas coisas? Estou enviando um script que fiz com teste para alguns caracteres. Desde já muito obrigada. Abs Fátima soundexBR<-function(termo){ termo<-toupper(termo) # 1. Retire toda pontuação da palavra; termo<-gsub("[ÃÁÀÂÄ]","A",termo) termo<-gsub("[ÉÈÊ?Ë]","E",termo) termo<-gsub("[ÍÌÏÎI]","I",termo) termo<-gsub("[ÓÕÒÔÖ]","O",termo) termo<-gsub("[ÚÙÛÜU]","U",termo) termo<-gsub("Ç","C",termo) #1.a Substituir todas as letras duplas por uma única letra #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([A-Z])\\1", "\\1", termo) # 2. Fique com a primeira letra; N<-nchar(termo) # Modificação PT-BR (Coeli e Camargo) termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo) termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo)
termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo) termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo)
termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo)
termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo) ############## Segunda Parte ####################### termo.1<-substr(termo,1,1) termo<-substr(termo,2,N) # 3. Mude todas as ocorrências das letras a seguir por '0' (zero): 'A','E','I','O','U','H','W','Y'; termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo) # 4. Mude as letras restantes de acordo com a tabela abaixo: # Número Letra # 1 'B','F','P','V' termo<-gsub("[B,F,P,V]",1,termo) # 2 'C','G','J','K', 'Q','S','X','Z' termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo) # 3 'D','T' termo<-gsub("[D,T]",3,termo) # 4 'L' termo<-gsub("L",4,termo) # 5 'M','N' termo<-gsub("[M,N]",5,termo) # 6 'R' termo<-gsub("R",6,termo) # 5. Remova todos os zeros da string resultante; termo<-gsub(0,"",termo) # Eliminar dois numeros iguais consecutivos por um único numero #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([0-9])\\1", "\\1", termo) # Remontar termo<-paste(termo.1,termo,sep="")
# 6. Preencha a string resultante com zeros à direita e retorne desta forma: #<letra maiuscula><digito><digito><digito> termo<-paste(termo,"0000",sep="") termo<-substr(termo,1,4) return(termo) }
soundexBR("termo") soundexBR("terno")
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) library(RecordLinkage) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Ponto de interrogação nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com o ? no início
############################################################################### #Barras inclinadas / nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com a barra inclinada #Barras inclinadas \ nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT")) nomea #O R rejeita a \ #Parênteses ( nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o parênteses depois do nome #Dois pontos e ponto e vírgula nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o : e ; depois do nome #Dólar e ponto nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT.")) nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Idem #Números
nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com números
_______________________________________________ R-br mailing list R-br@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature}
"Small steps toward a much better world" _______________________________________________ R-br mailing list R-br@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@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature} "Small steps toward a much better world"

Valeu. Abs Em 17 de março de 2013 15:43, Daniel Marcelino <dmarcelino@live.com>escreveu:
Dá pra fazer tudo tranquilamente. Inclusive, se você perceber que há muito erro por vício de digitação etc, você pode tentar implementar um pequeno dicionário de substituições e passar como função no R. Acabei de ver que a solução que eu te passei não corrige as barras "\". Para isso você teria que passar essa outra:
nomea=data.frame(nome=c("?GER\\D","\\HART$MUT","R%ALF\\","STEFAN8","?ROBERT"))
nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
nomea$nome2<- gsub('[^[:alnum:]]', '', nomea$nome)
nomea nome nome2 1 GER\\D GERD 2 \\HARTMUT HARTMUT 3 RALF\\ RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Valeu, Daniel. Acho que, como falei com meus orientadores isso se resolve levanco os nomespara o excel. É que a gente queria ver se daria para fazer no R. Obrigada. Abs
Em 17 de março de 2013 15:24, Daniel Marcelino <dmarcelino@live.com> escreveu:
Fátima, dá pra fazer isso, só não sei ainda se incorporando uma solução ad-hoc é a melhor coisa a ser feita na função original. Preciso pensar um pouco mais sobre as implicações dessa alteração para as bases de dados que a função foi inicialmente implementada. Uma forma de você resolver isso "bypass" é passando o comando abaixo nas variáveis que contêm nomes antes de aplicar o soundex. Por exemplo:
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT"))
nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
nomea nome nome2 1 GER?D GERD 2 HARTMUT HARTMUT 3 RALF RALF 4 STEFAN STEFAN 5 ROBERT ROBERT
soundexBR(nomea$nome) [1] "J-6?3" "A-635" "R-410" "S-315" "R-163"
soundexBR(nomea$nome2) [1] "J-630" "A-635" "R-410" "S-315" "R-163"
Fátima, o problema é que se o erro de entrada de dados estiver na primeira letra do nome, e se o caracter errado estiver ocupando o lugar de uma letra (por ex. % ao invés de H), a string gerada ficará incorreta. Isso pode ser um problema. A solução que eu te passei apenas retira os caracteres estranhos dos nomes, mas não "advinha" qual letra deveria estar no lugar, percebe? A boa notícia é que se sua base de dados tiver muitos erros de entrada, nada te garante também que um nome, aparentemente correto, digo, com apenas letras (Naria ao invés de Maria), não esteja sendo codificado de forma errada ("N-600", "M-600").
Daniel
2013/3/17 Fátima Lima Paula <fatima.lima.paula@gmail.com>:
Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex. Verifiquei que erros de digitação não são captados pelo SoundexBR. Exemplo: ?MARIA e MARIA, PE8DRO e PEDRO. Será que seria tranquilo para você implementar algumas coisas? Estou enviando um script que fiz com teste para alguns caracteres. Desde já muito obrigada. Abs Fátima soundexBR<-function(termo){ termo<-toupper(termo) # 1. Retire toda pontuação da palavra; termo<-gsub("[ÃÁÀÂÄ]","A",termo) termo<-gsub("[ÉÈÊ?Ë]","E",termo) termo<-gsub("[ÍÌÏÎI]","I",termo) termo<-gsub("[ÓÕÒÔÖ]","O",termo) termo<-gsub("[ÚÙÛÜU]","U",termo) termo<-gsub("Ç","C",termo) #1.a Substituir todas as letras duplas por uma única letra #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([A-Z])\\1", "\\1", termo) # 2. Fique com a primeira letra; N<-nchar(termo) # Modificação PT-BR (Coeli e Camargo) termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo) termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo)
termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo)
termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo)
termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo)
termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo)
############## Segunda Parte ####################### termo.1<-substr(termo,1,1) termo<-substr(termo,2,N) # 3. Mude todas as ocorrências das letras a seguir por '0' (zero): 'A','E','I','O','U','H','W','Y'; termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo) # 4. Mude as letras restantes de acordo com a tabela abaixo: # Número Letra # 1 'B','F','P','V' termo<-gsub("[B,F,P,V]",1,termo) # 2 'C','G','J','K', 'Q','S','X','Z' termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo) # 3 'D','T' termo<-gsub("[D,T]",3,termo) # 4 'L' termo<-gsub("L",4,termo) # 5 'M','N' termo<-gsub("[M,N]",5,termo) # 6 'R' termo<-gsub("R",6,termo) # 5. Remova todos os zeros da string resultante; termo<-gsub(0,"",termo) # Eliminar dois numeros iguais consecutivos por um único numero #http://www.archives.gov/genealogy/census/soundex.html termo<-gsub("([0-9])\\1", "\\1", termo) # Remontar termo<-paste(termo.1,termo,sep="")
# 6. Preencha a string resultante com zeros à direita e retorne desta forma: #<letra maiuscula><digito><digito><digito> termo<-paste(termo,"0000",sep="") termo<-substr(termo,1,4) return(termo) }
soundexBR("termo") soundexBR("terno")
nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) library(RecordLinkage) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Ponto de interrogação nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com o ? no início
###############################################################################
#Barras inclinadas / nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT")) nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com a barra inclinada #Barras inclinadas \ nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT")) nomea #O R rejeita a \ #Parênteses (
nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)"))
nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o parênteses depois do nome #Dois pontos e ponto e vírgula
nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;"))
nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Só funciona com o : e ; depois do nome #Dólar e ponto
nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT."))
nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Idem #Números
nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6"))
nomea nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF")) nomeb fonoa=soundexBR(nomea$nome) fonob=soundexBR(nomeb$nome) pairs.mat = outer(fonoa,fonob, "==") pairs.mat #Não funciona com números
_______________________________________________ R-br mailing list R-br@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature}
"Small steps toward a much better world" _______________________________________________ R-br mailing list R-br@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@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.
-- \begin{signature} Daniel Marcelino ☁ dm.silva@umontreal.ca ☎ (514) 343 6111 #3799 Skype: d.marcelino ✎ 3200 Jean Brillant, Office C5071 Montreal, QC; H3T 1N8 Canada \end{signature}
"Small steps toward a much better world" _______________________________________________ R-br mailing list R-br@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.
participantes (2)
-
Daniel Marcelino
-
Fátima Lima Paula