2012-02-23 7 views
12

en R, tengo una columna en una hoja.de.datos así:Cómo buscar múltiples cadenas y reemplazarlos con nada dentro de una lista de cadenas

npt2 nombre $

[1] "Andreas Groll, MD"
[2] ""
[3] "Pan-Chyr Yang, PHD"
[4] "Suh-colmillo Jeng, Sc.D"
[5] "Mostafa K Mohamed Fontanet Arnaud"
[ 6] "Thomas Jozefiak, MD"
[7] "Monitor Médico"
[8] "Qi Zhu, MD"
[9] "acebo Posner"
[10] "Peter S Sebel, MB BS, PhD Chantal Kerssens, PhD"
[11] "Lance A Mynderse, MD"
[12] "Lawrence Currie, MD"

Probé gsub pero sin suerte. después de hacer toupper (x) Necesito reemplazar todas las instancias de 'MD' o 'M.D.' o 'PHD' sin nada ''.

¿Hay un pequeño truco dentro de R para hacerlo?

De hecho estaría interesado en ver que se haga en una sola cuerda y lo diferente es que se haga en un comando en la lista entera (no soy muy bueno en la programación funcional aún)

+0

¿Qué hay sobre "Sc.D"? –

+0

Esperaba evitar expresiones regulares ya que simplemente puedo enumerar todas las cadenas malas que se eliminarán. Oh mi ... otra tecnología más (REgEx) para volver a (remasterización) :-( – userJT

+0

El campo debe ser solo apellido, pero los datos no son consistentes. El objetivo es terminar con solo datos que son ya sea un apellido o nombre y eliminar todos los títulos académicos o de otro tipo – userJT

Respuesta

23

Cualquiera de estos:

gsub("MD|M\\.D\\.|PHD", "", test) # target specific strings 
gsub("\\,.+$", "", test)  # target all characters after comma 

Tanto Matt Parker arriba y abajo Tommy han planteado la cuestión de si 'CPRM', 'Doctor', 'D. Phil. y 'Ph.D.' u otras designaciones británicas o continentales de grados de doctorado deben buscarse y eliminarse. Tal vez @ user56 puede aconsejar cuál fue la intención.

+0

oo buena respuesta. ¡Siempre me olvido o en expresiones regulares! – Justin

+0

¿No sería 'gsub'? Pensé que 'sub' solo coincidía con la primera instancia ... –

+1

@MattParker' sub' solo coincide con la primera instancia, pero aún así 'vectorized'. Por lo tanto, coincidirá con la primera instancia en cada elemento del vector. – Justin

3

Con una sola expresión regular fea:

gsub('[M,P].?D.?','',npt2$name) 

¿Qué dice, encontrar caracteres M o P seguido de cero o un carácter de cualquier tipo, seguido por un D y cero o un carácter adicional. Más explícitamente, puede hacer esto en tres pasos:

npt2$name <- gsub('MD','',npt2$name) 
npt2$name <- gsub('M\\.D\\.','',npt2$name) 
npt2$name <- gsub('PhD','',npt2name) 

En esos tres, lo que está sucediendo debería ser más directo. el segundo reemplazo que necesita para "escapar" del período ya que es un personaje especial.

+0

Me gusta la expresión regular combinada, pero creo que necesitaría especificar un período literal opcional en lugar de un carácter opcional any-char entre las letras - considere "Brian McDonald", por ejemplo. –

+0

Touche! pero luego extrañas a MD Si estuviera haciendo esto, lo haría explícitamente con un reemplazo por línea para mayor claridad y repetibilidad. (o la versión de DWin con Ors lógico) – Justin

+0

¿Extrañaría MD? 'gsub ('[M, P] \\.? D \\.?', ''," Brian McDonald, MD ")' logra el efecto deseado, ¿no? –

2

Aquí hay una variante que elimina el "," extra también. Tampoco requiere touppper, pero si lo desea, simplemente especifique ignore.case=TRUE en gsub.

test <- c("Andreas Groll, M.D.", 
    "", 
    "Pan-Chyr Yang, PHD", 
    "Suh-Fang Jeng, Sc.D", 
    "Peter S Sebel, MB BS, PhD Chantal Kerssens, PhD", 
    "Lawrence Currie, MD") 

gsub(",? *(MD|M\\.D\\.|P[hH]D)", "", test) 
#[1] "Andreas Groll"       ""          
#[3] "Pan-Chyr Yang"       "Suh-Fang Jeng, Sc.D"     
#[5] "Peter S Sebel, MB BS Chantal Kerssens" "Lawrence Currie" 
Cuestiones relacionadas