2012-02-23 9 views
12

in R, ho una colonna in una data.frame come questo:Come per la ricerca di stringhe multiple e sostituirli con nulla all'interno di una lista di stringhe

NPT2 $ nome

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

ho provato gsub ma senza fortuna. dopo aver eseguito toupper (x) Ho bisogno di sostituire tutte le istanze di 'MD' o 'M.D.' o 'PHD' con niente ''.

C'è un bel trucco breve in R per farlo?

In realtà sarei interessato a vederlo fatto su una singola stringa e come diversamente si fa in un solo comando su tutta la lista (io non sono molto bravo a programmazione funzionale ancora)

+0

Che dire di "Sc.D"? –

+0

Speravo di evitare le espressioni regolari dal momento che posso semplicemente enumerare tutte le stringhe errate da rimuovere. Oh my .... ancora un'altra tecnologia (REgEx) per tornare a (re-master) :-( – userJT

+0

Il campo dovrebbe essere solo il cognome, ma i dati non sono coerenti. L'obiettivo è finire con solo i dati che sono o il cognome o il nome e rimuovere tutti i titoli accademici o di altro tipo – userJT

risposta

23

Uno di questi:

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

sia Matt Parker sopra e al di sotto Tommy hanno sollevato la questione se 'CPRM', 'PhD', 'D. Phil.' e "dottorato" o altre designazioni britanniche o continentali di dottorato dovrebbero essere ricercate e rimosse. Forse @ user56 può consigliare quale fosse l'intento.

+0

oo buona risposta. Mi dimentico sempre o nelle regex! – Justin

+0

Non sarebbe 'gsub'? Ho pensato che 'sub' ha appena abbinato la prima istanza ... –

+1

@MattParker' sub' fa solo corrispondere alla prima istanza, ma è ancora 'vettorializzata'. Quindi corrisponderà alla prima istanza in ogni elemento del vettore. – Justin

3

Con una sola brutta espressione regolare:

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

che dice, trovare personaggi M o P seguita da zero o un carattere di ogni genere, seguita da una D e zero o un carattere aggiuntivo. Più esplicitamente, si potrebbe fare questo in tre fasi:

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

In quei tre, quello che sta accadendo dovrebbe essere più semplice. la seconda sostituzione è necessaria per "scappare" dal punto in cui è un personaggio speciale.

+0

Mi piace la regex combinata, ma penso che avresti bisogno di specificare un periodo letterale facoltativo invece di un qualsiasi carattere facoltativo tra le lettere - prendi in considerazione "Brian McDonald", per esempio. –

+0

Touche! ma poi ti manca MD. Se facessi questi dati, lo farei esplicitamente con una sostituzione per riga per chiarezza e ripetibilità. (o la versione di DWin con OR logico) – Justin

+0

Mancherebbe MD? 'gsub ('[M, P] \\.? D \\.?', ''," Brian McDonald, MD ")' ottiene l'effetto desiderato, giusto? –

2

Ecco una variante che rimuove anche l'extra ",". Non richiede né touppper - ma se lo desideri, specifica ignore.case=TRUE a 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" 
Problemi correlati