2016-05-24 6 views
5

Ich möchte Gsub verwenden, um einige Namen zu korrigieren, die in meinen Daten sind. Ich will Namen wie "R. J." und "A. J." keinen Platz zwischen den Buchstaben haben.gsub nur Teil des Musters

Zum Beispiel:

x <- "A. J. Burnett" 

Ich möchte gsub verwenden, um das Muster seines Vornamens zu entsprechen, und dann den Raum entfernen:

gsub("[A-Z]\\.\\s[A-Z]\\.", "[A-Z]\\.[A-Z]\\.", x) 

Aber ich bekomme:

[1] "[A-Z].[A-Z]. Burnett" 

Offensichtlich möchte ich anstelle der [AZ] die tatsächlichen Buchstaben im ursprünglichen Namen. Wie kann ich das machen?

+4

http://stackoverflow.com/questions/29463495/how-to-replace-many-special-characters-with-something-plus-special-characters – rawr

Antwort

6

Verwenden Sie Erfassungsgruppen, indem Sie Muster in (...) einschließen, und beziehen Sie sich auf die erfassten Muster mit \\1, \\2 und so weiter. In diesem Beispiel:

x <- "A. J. Burnett" 
gsub("([A-Z])\\.\\s([A-Z])\\.", "\\1.\\2.", x) 
[1] "A.J. Burnett" 

Beachten Sie auch, dass in den Ersatz müssen Sie die . Zeichen nicht entkommen, da sie dort keine besondere Bedeutung haben.

+0

Ehrfürchtig, danke! – Colin

1

Sie können einen Look-ahead ((?=\\w\\.)) und einen Look-Behind ((?<=\\b\\w\\.)) verwenden, um solche Leerzeichen zu markieren und sie durch "" zu ersetzen.

x <- c("A. J. Burnett", "Dr. R. J. Regex") 
gsub("(?<=\\b\\w\\.) (?=\\w\\.)", "", x, perl = TRUE) 
# [1] "A.J. Burnett" "Dr. R.J. Regex" 

Der Vorgriff entspricht ein Wortzeichen (\\w) gefolgt von einem Punkt (\\.) und der Blick hinter entspricht eine Wortgrenze (\\b) von einem Wortzeichen und einer Periode gefolgt.