2012-02-23 6 views
12

w R Mam kolumny w data.frame tak:Jak szukać wielu ciągów i zastąpienie ich z niczym w liście ciągów

npt2 $ nazwa

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

Próbowałem gsub, ale bez powodzenia. po wykonaniu toupper (x) Muszę zastąpić wszystkie wystąpienia "MD" lub "M.D." lub "PHD" bez niczego ".

Czy jest to dobra krótka sztuczka w R, aby to zrobić?

W rzeczywistości Byłbym zainteresowany, aby zobaczyć to zrobić na jednym ciągiem i jak inaczej to się robi w jednym poleceniu na całej listy (nie jestem bardzo dobry w jeszcze programowania funkcyjnego)

+0

Co z "Sc.D"? –

+0

Miałem nadzieję uniknąć Wyrażeń regularnych, ponieważ mogę po prostu wyliczyć wszystkie niepoprawne ciągi do usunięcia. Oh my .... jeszcze inna technologia (REgEx), aby wrócić do (ponownego opanowania) :-( – userJT

+0

Pole powinno być tylko nazwisko, ale dane nie są spójne. Cel ma skończyć z danymi, które są albo nazwisko lub imię i usuń wszystkie akademickie lub inne tytuły. – userJT

Odpowiedz

23

Każda z nich:

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

Zarówno Matt Parker powyżej i poniżej Tommy podniosły kwestię, czy 'MRCP', 'PhD', "D.Phil. i "doktorat" lub inne brytyjskie lub kontynentalne oznaczenia stopni naukowych doktoranckich należy wyszukiwać i usuwać. Być może @ user56 może doradzić, jakie były intencje.

+0

oo Dobra odpowiedź. Zawsze zapominam o regexach lub w nich! – Justin

+0

Czy to nie byłby 'gsub'? Myślałem, że 'sub' po prostu pasuje do pierwszej instancji ... –

+1

@MattParker' sub' po prostu pasuje do pierwszej instancji, ale nadal jest "wektoryzowany". Dopasuje to pierwszą instancję w każdym elemencie wektora. – Justin

3

Z jednego brzydkiego regex:

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

który mówi, znaleźć znaki M lub P następuje zero lub jeden znak w jakiejkolwiek formie, a następnie przez D i dodatkowe zera lub jednego znaku. Bardziej jednoznacznie, możesz to zrobić w trzech krokach:

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

To, co się dzieje, powinno być bardziej proste. drugi zamiennik, którego potrzebujesz, aby "uciec" z tego okresu, ponieważ jest to znak specjalny.

+0

Podoba mi się połączone wyrażenie, ale myślę, że musisz określić opcjonalny okres literowy zamiast opcjonalnego dowolnego znaku między litery - na przykład "Brian McDonald". –

+0

Touche! ale potem tęsknisz za MD. Gdybym robił te dane munge, robiłbym to wyraźnie z jednym zamiennikiem w linii dla jasności i powtarzalnie. (lub wersja DWin z logicznym Ors) – Justin

+0

Czy to by nie było MD? 'gsub ('[M, P] \\.? D \\.?', ''," Brian McDonald, MD ")' osiąga pożądany efekt, prawda? –

2

Oto wariant, który usuwa dodatkowy "," też. Nie wymaga też touppper - ale jeśli chcesz, po prostu określ ignore.case=TRUE na 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" 
Powiązane problemy