2015-09-24 7 views
5

Ich habe einen Vektor von (menschlichen) Namen bekam, alle in Großbuchstaben:Decapitalize menschlichen Namen (Bilanzierung von 'und -)

names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN") 

Um bisher zu decapitalize (die ersten Buchstaben nur Kapital), war ich mit

simpleDecap <- function(x) { 
    s <- strsplit(x, " ")[[1]] 
    paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=" ") 
    } 
sapply(names, simpleDecap, USE.NAMES=FALSE) 
# [1] "Friedrich Schiller"   "Frank O'hara"   "Hans-christian Andersen" 

Aber ich möchte auch berücksichtigen ' und -. Using s <- strsplit(x, " |\\'|\\-")[[1]] findet natürlich die richtigen Buchstaben, aber dann in den Kollaps ' und - gehen verloren. Daher habe ich versucht,

simpleDecap2 <- function(x) { 
    for (char in c(" ", "\\-", "\\'")){ 
    s <- strsplit(x, char)[[1]] 
    x <-paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=char) 
    } return x 
    } 

sapply (Namen, simpleDecap, USE.NAMES = FALSE)

aber das ist noch schlimmer, natürlich, da die Ergebnisse geteilt werden einer nach dem anderen:

sapply(names, simpleDecap2, USE.NAMES=FALSE) 
# [1] "Friedrich schiller"  "Frank o'Hara"   "Hans-christian andersen" 

Ich denke der richtige Ansatz teilt sich nach s <- strsplit(x, " |\\'|\\-")[[1]], aber das paste= ist das Problem.

Antwort

6

Dies scheint zu funktionieren, mit Perl kompatible reguläre Ausdrücke:

gsub("\\b(\\w)([\\w]+)", "\\1\\L\\2", names, perl = TRUE) 

\L die folgende Match Gruppe Fall zu senken verwandelt.

+1

liebe die Prägnanz * und * Unverständlichkeit von Perl-Regexp :-) –

+0

@CarlWitthoft Ich stimme wirklich damit nicht überein. Wie jede andere Sprache müssen sie gelernt werden, aber für das, was sie ausdrücken, sind sie sehr einfach und verständlich. Die generelle Behauptung, dass Regex unverständlich sei, ist eine große Gemeinsamkeit: Äquivalent ist manueller Parsing-Code fast immer komplexer und schwerer zu verstehen. Das Wort "unverständlich" dafür zu benutzen, ist wirklich irreführend. –

+1

Es ist eine humorvolle Ausgrabung am Meme, dass Perl selbst Programmierstil ermöglicht, der den verschleierten C-Code-Wettbewerb im Vergleich blass macht. Natürlich ist Regex * der * Weg zur String-Manipulation. –

0

Obwohl ich stimme zu, dass Perl regexp ist die bessere Lösung, aber die simpleDecap2 Ansatz ist nicht so weit weg von der Arbeit.

simpleDecap3 <- function(x) { 
    x <- tolower(x) 
    for (char in c(" ", "-", "'")){ 
     s <- strsplit(x, char)[[1]] 
     x <-paste0(toupper(substring(s, 1,1)), substring(s, 2), collapse=char) 
    } 
    x 
} 

Das heißt, drehen Sie den ganzen Namen in Kleinbuchstaben und dann den ersten Buchstaben nach „Kapital“, „-“ oder „'“. Nicht so gut aussehend wie die Regexp und höchstwahrscheinlich nicht so robust, aber es macht den Job mit nur kleinen Änderungen von Ihrem ursprünglichen Code erledigt.

+0

Dies gibt nur den ersten Wert zurück. –

+0

Ja, es hat das gleiche Format wie 'simpleDecap2', Sie müssen es wie' sapply (names, simpleDecap3, USE.NAMES = FALSE) aufrufen '. – DGKarlsson

Verwandte Themen