En R, ¿cómo reemplazo una cadena que contiene un determinado patrón con otra cadena?

StackOverflow https://stackoverflow.com/questions/5302669

  •  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!

¿Fue útil?

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.

http://en.wikipedia.org/wiki/approximate_string_matching

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top