[R-br] Trabalhar com pares do RecordLinkage

Daniel Marcelino dmsilva.br em gmail.com
Segunda Dezembro 17 21:58:28 BRST 2012


Não sei se eu entendi direito, mas digamos que você termine seu
programa assim (eu só modifiquei a última linha):

data <- getPairs(pesos,max.weight=Inf, min.weight=-Inf)

# Se sua preocupação for só com a variável "dataint", você pode
ordenar a tabela:
data <- data[order(data$dataint), ]
# E gerar um indicador das datas repetidas
data$match <- as.numeric(data$dataint)

# A partir daí você pode separar os valores pares ou os ímpares:
pares <- subset(data, duplicated(dataint))
impares <- subset(data, !duplicated(dataint))



2012/12/17 Fátima Lima Paula <fatima.lima.paula em gmail.com>:
> Prezados, preciso trabalhar com os pares resultantes do RecordLinkage e não
> sei como fazer. Enviei email para o autor do pacote, mas ele disse que terei
> que programar, pois não existe uma maneira automática de fazer isso. Bem, aí
> vai, meu desafio:
> Tenho dois bancos ( um retirado do outro) e vou fazer o linkage para obter
> as readmissões. No resultado sempre haverá um par de cada um, com mesma data
> de internação, já que o banco menor é retirado do maior (o menor é de
> internados por fratura de fêmur e o maior é de internados por todas as
> causas). Aí vai um exemplo criado para você verem como é a saída dos pares:
>
> nome=c("Ricardo","Maria","Tereza","Pedro","José", "Germano")
> sobrenome=c("Cunha","Andrade","Silva","Soares","Silva","Lima")
> idade=c(67,89,78,65,68,67)
> ano=c(1945,1923,1934,1947,1944,1945)
> dataint=c(20120907,20120703,20120301,20120805,20121004,20121209)
> banco1=cbind(nome,sobrenome,idade,ano,dataint)
> banco1=data.frame(banco1)
> banco1
> nome=c("Maria","Lúcia","Paulo","Marcos", "Ricardo", "Germanio")
> sobrenome=c("Andrade","Silva","Soares","Pereira","Cunha","Lima")
> idade=c(67,88,78,60,68,80)
> ano=c(1945,1924,1934,1952,1944,1932)
> dataint=c(20121208,20121103,20120302,20120105,20121004,20121209)
> banco2=cbind(nome,sobrenome,idade,ano,dataint)
> banco2=data.frame(banco2)
> banco2
> str(banco1)
> banco1$nome=as.character(banco1$nome)
> banco1$sobrenome=as.character(banco1$sobrenome)
> banco1$idade=as.character(banco1$idade)
> banco1$ano=as.character(banco1$ano)
> banco1$dataint=as.character(banco1$dataint)
> banco2$nome=as.character(banco2$nome)
> banco2$sobrenome=as.character(banco2$sobrenome)
> banco2$idade=as.character(banco2$idade)
> banco2$ano=as.character(banco2$ano)
> banco2$dataint=as.character(banco2$dataint)
> library(RecordLinkage)
> 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")
>
> pares=compare.linkage(banco1,banco2,blockfld=list(c(1,2,4),c(1,2)),
>                       phonetic=c(1,2),phonfun=soundexBR,strcmp=FALSE,
>                       strcmpfun=jarowinkler,
> exclude=FALSE,identity1=NA,identity2=NA,
>                       n_match=NA, n_non_match=NA)
> editMatch(pares)
> pares
> pesos=epiWeights(pares, e=0.01,f=pares$frequencies)
> hist(pesos$Wdata,plot=F)
> getPairs(pesos,max.weight=Inf, min.weight=-Inf)
>
> Agora, como tenho as datas da internação de todos, preciso verificar, par a
> par, quem tem data de internação diferente. Estes serão as readmissões.
> Existe uma forma de eu criar uma coluna para identificar os pares? E depois,
> testar se as datas de internação são diferentes?
> Obrigada
> Fátima
>
> _______________________________________________
> 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.



-- 
"Small steps toward a much better world"

\begin{signature}
Daniel Marcelino
☁ dm.silva em umontreal.ca
☎ (514) 343 6111 #3799
✎ 3200 Jean Brillant,  Office C5071
Montreal, QC; H3T 1N8
Canada
\end{signature}


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