En R, ¿cómo reemplazo una cadena que contiene un determinado patrón con otra cadena?
-
24-10-2019 - |
Pregunta
Estoy trabajando en un proyecto que involucra limpiar una lista de datos sobre especialidades universitarias. Encuentro que muchos están mal mal, así que estaba buscando usar la función gsub()
Para reemplazar los mal escritos con su ortografía correcta. Por ejemplo, digamos que 'Biolgy' está mal escrita en una lista de estudiantes llamados Major. ¿Cómo puedo hacer que R detecte la falta de ortografía y la reemplazar con su ortografía correcta? He intentado gsub('biol', 'Biology', Major)
Pero eso solo reemplaza las primeras cuatro letras en 'Biolgy'. Si lo hago gsub('biolgy', 'Biology', Major)
, funciona solo para ese caso, pero eso no detecta otras formas de mal ortográficos de 'biología'.
¡Gracias!
Solución
Debe definir una expresión regular ingeniosa o usar agrep
de base
paquete. stringr
El paquete es otra opción, sé que la gente lo usa, pero soy un gran fanático de las expresiones regulares, por lo que es un no-no para mí.
De todos modos, agrep
Debería hacer el truco:
agrep("biol", "biology")
[1] 1
agrep("biolgy", "biology")
[1] 1
EDITAR:
También deberías usar ignore.case = TRUE
, pero prepárate para hacer una contabilidad "a mano" ...
Otros consejos
Puede configurar un vector de todas las malas ortográficas posibles y luego hacer un bucle sobre una llamada GSUB. Algo como:
biologySp = c("biolgy","biologee","bologee","bugs")
for(sp in biologySp){
Major = gsub(sp,"Biology",Major)
}
Si desea hacer algo más inteligente, vea si hay algún paquete de coincidencia difuso en CRAN, o algo que use 'SoundEx' coincidente ...
La página de Wikipedia en aprox. La coincidencia de cadenas puede ser útil e intente buscar R-HELP para algunos de los términos clave.
Primero podría igualar a las mayores con una lista de especialidades disponibles, cualquier no coincidencia sería la probable Misspellings. Luego use la función AGREP para que coincida con las especialidades conocidas nuevamente (AGREP realiza una coincidencia aproximada, por lo que si es similar a un valor correcto, obtendrá una coincidencia).
El paquete VWR tiene métodos para la coincidencia de cadenas:
http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/vwr/index.html
Por lo tanto, su mejor opción podría ser usar la cadena con la distancia mínima de Levenshtein de las posibles cadenas de sujetos:
> levenshtein.distance("physcs",c("biology","physics","geography"))
biology physics geography
7 1 9
Si obtienes mínimos idénticos, voltea una moneda:
> levenshtein.distance("biolsics",c("biology","physics","geography"))
biology physics geography
4 4 8
Ejemplo 1a) Perl/Linux Regex: 's/oldstring/newstring/'
Ejemplo 1b) r equivalente de 1a: srcstring=sub(oldstring, newstring, srcstring)
Ejemplo 2a) Perl/Linux Regex: 's/oldstring//'
Ejemplo 2b) r equivalente de 2a: srcstring=sub(oldstring, "", srcstring)