2011-03-14 21 views
11

Estoy trabajando en un proyecto que incluye la limpieza de una lista de datos sobre carreras universitarias. Encuentro que muchos están mal escritos, así que estaba buscando usar la función gsub() para reemplazar los errores ortográficos con su ortografía correcta. Por ejemplo, diga 'biolgy' está mal escrito en una lista de mayores llamada Major. ¿Cómo puedo hacer que R detecte el error de ortografía y lo reemplace con su ortografía correcta? Intenté 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 errores ortográficos de "biología".En R, ¿cómo reemplazo una cadena que contiene un cierto patrón con otra cadena?

¡Gracias!

Respuesta

13

Debería bien definir algunas expresiones regulares ingenioso, o utilizar agrep de base paquete. stringr paquete es otra opción, sé que la gente lo usa, pero soy un gran fan de las expresiones regulares, por lo que es un no-no para mí.

De todos modos, agrep debe hacer el truco:

agrep("biol", "biology") 
[1] 1 
agrep("biolgy", "biology") 
[1] 1 

EDIT:

También debe utilizar ignore.case = TRUE, pero estar preparado para hacer un poco de contabilidad "a mano" ...

+0

Gracias por su respuesta, jugué con agrep justo ahora. Me parece que simplemente devuelve un número entero (que supongo que corresponde a la cantidad de cadenas modificadas), pero ¿realmente ejecuta el cambio? Entonces, por ejemplo, di que tenía animals = c ("mouse", "dog", "cat"). Si quisiera reemplazar el mouse con, digamos "cheese", ¿puedo usar agrep ("mou", "cheese", animals)? Devuelve un número entero (0) cuando hago esto. ¡¡Gracias!! – Alan

+0

'agrep' devuelve índices de vectores, por lo que puede asignar fácilmente un valor mediante el uso de subíndices:' animals [agrep ("mou", animals)] <- "cheese" ' – aL3xa

+0

Excelente gracias :) – Alan

2

Puede configurar un vector de todas las posibles faltas de ortografía y luego hacer un ciclo sobre una llamada gsub. Algo así como:

biologySp = c("biolgy","biologee","bologee","bugs") 

for(sp in biologySp){ 
    Major = gsub(sp,"Biology",Major) 
} 

Si quieres hacer algo más inteligente, ver si hay algún paquete de coincidencia aproximada en CRAN, o algo que se utiliza 'soundex' a juego ....

la página de Wikipedia en aprox. La coincidencia de cadenas puede ser útil e intentar buscar ayuda de R para algunos de los términos clave.

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

+0

Ya hay coincidencia difusa en el paquete 'base': la función' agrep' hace eso. Ver mi respuesta a continuación. – aL3xa

2

Usted Primero podría hacer coincidir las Grandes Ligas con una lista de Grandes Ligas disponibles, cualquiera que no coincida sería la probable falta de ortografía. A continuación, utilice la función agrep para hacer coincidir estos contra los mayores conocidos de nuevo (agrep hace aproximación de coincidencia, por lo que si es similar a un valor correcto, entonces obtendrá una coincidencia).

+0

Y para eso para los mayores remanentes, algo como 'replace (remainingMajor, agrep (" biology ", remainingMajor)," biology ") debería hacerlo. – hatmatrix

+0

(pero consulte antes con 'remainingMajor [agrep (" biology ", remainingMajor)]' para ver lo que va a reemplazar) – hatmatrix

0

El paquete VWR cuenta con métodos para la cadena coincidente:

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/vwr/index.html

así que lo mejor sería utilizar la cuerda con la distancia mínima Levenshtein de las posibles cadenas temáticas:

> levenshtein.distance("physcs",c("biology","physics","geography")) 
    biology physics geography 
     7   1   9 

Si obtiene los mínimos idénticos, entonces voltee una moneda:

> levenshtein.distance("biolsics",c("biology","physics","geography")) 
    biology physics geography 
     4   4   8 
0

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)

Cuestiones relacionadas