una sustraer separar regular partir palabra longitud generar extraer expresión especiales concatenar comparar columnas caracteres cadenas cadena r merge character spelling misspelling

sustraer - Hacer frente a la ortografía incorrecta al hacer coincidir cadenas de texto en R



separar cadena de caracteres en r (2)

Recolecto datos de encuestas (usando el kit de datos abiertos) y mi equipo de campo, bendigo sus corazones, a veces soy un poco creativo con la ortografía de los nombres de las personas. Así que tengo un nombre de encuestado "correcto", así como una variable de edad para algunos de los registros que están vinculados a una variable de "nombre de miembro de la familia". Hay muchos miembros de la familia con diferentes edades. Quiero edad del encuestado.

Aquí hay algunos datos falsos que ilustran mi problema:

#the respondent r = data.frame(name = c("Barack Obama", "George Bush", "Hillary Clinton")) #a male member m = data.frame(name = c("Barack Obama","George", "Wulliam Clenton"), age = c(55,59,70)); m$name=as.character(m$name) #a female member f = data.frame(name = c("Michelle O","Laura Busch", "Hillary Rodham Clinton"), age = c(54,58,69)); f$name=as.character(f$name) #if the responsent is the the given member, record their age. if not, NA a = cbind( ifelse(r$name==m$name,m$age,NA) ,ifelse(r$name==f$name,f$age,NA) ) #make a function for plyr that gives me the age of the matched respondent f = function(row){ d = row[is.na(row)==0] ifelse(length(d)==0,NA,d) } require(plyr) b = aaply(a,.margins=1,.fun=f) data.frame(names=r$name,age=b) names age 1 Barack Obama 55 2 George Bush NA 3 Hillary Clinton NA what.I.would.like = data.frame(names=c("Barack Obama", "George Bush", "Hillary Clinton"),age = c(55,59,70)) 1> what.I.would.like names age 1 Barack Obama 55 2 George Bush 59 3 Hillary Clinton 70

en mi información real, tengo cientos de personas y hasta 13 familiares. Desde entonces, he cambiado la encuesta para registrar la edad de los encuestados por separado, pero tengo un lío de datos para limpiar.


Los problemas de ortografía se tratan comúnmente mediante el uso de alguna variante del algoritmo soundex . Hay una implementación R en el paquete RecordLinkage . Entonces no necesita comparar las cadenas en sí mismas sino sus "códigos fonéticos":

> soundex(''Clenton'') == soundex(''Clinton'') [1] TRUE

ACTUALIZACIÓN: También hay otra forma de determinar si dos palabras están "cercanas" entre sí, lo que es una "distancia" es algún sentido entre las palabras. Una medida estándar de las distancias es la cantidad mínima de reemplazos de una letra, eliminaciones e inserciones necesarias para transformar la primera palabra en la segunda. Se llama distancia Levenshtein . RecordLinkage y el paquete vwr tienen las funciones adecuadas:

> levenshteinDist(''Clinton'', ''Clenton'') [1] 1 > vwr::levenshtein.distance(''Clinton'', ''Clenton'') Clenton 1

Luego puede usar las distancias y considerar las palabras "cerrar" lo suficiente si la distancia no excede algún umbral.


Te recomiendo que uses la distancia Jaro-Winkler , una métrica de similitud de cadenas desarrollada para resolver este problema exacto en los datos del censo de EE. UU. Es más sofisticado que la distancia levenshtein y está diseñado específicamente para trabajar con nombres. Puede encontrar una implementación R en el paquete RecordLinkage . Tendrá que establecer un límite de corte (por ejemplo, 0,8) para ver qué tan similares deben ser las dos cuerdas.

install.packages(''RecordLinkage'',''RSQLite'') require(RecordLinkage) jarowinkler(''William Clinton'', "Willam Clntn") # 0.96 jarowinkler(''William Clinton'', "Wuliam Clinton") # 0.8462637 jarowinkler(''William Clinton'', "Hilary Clinton") # 0.7790765

Recomiendo establecer un umbral razonablemente alto (tal vez 0,9) para la coincidencia automática y luego enviar registros por debajo del alto umbral, pero por encima de un umbral inferior secundario (tal vez 0,7) para la revisión humana. Deberías jugar con estos números y ver qué funciona para ti. Estos valores determinarán su compromiso de sensibilidad / especificidad .