2017-01-31 3 views
1

Ich bin sicher, dass es ein beredter Weise:Erste Initialen von einem Namen in R

NAMES <- data.frame(ID = "George Washington") 
NAMES$ID <- as.character(NAMES$ID) 

gsub(" ", "", paste(substr(data.frame(strsplit(NAMES$ID, " "))[[1]], 1, 1), collapse=" ")) 

[1] „GW“

+0

Verwenden Sie 'gsub (" [^ AZ] * ([AZ]) [^ AZ] * "," \\ 1 ", NAMES $ ID)' –

Antwort

2

Wir ein oder mehr Zeichen entsprechen können, die keine Großbuchstaben sind Buchstaben ([^A-Z]+), die einen Großbuchstaben folgt (mit dem regex Lookarounds - (?<=[A-Z])) und ersetzen sie es mit einem leeren ("")

gsub("(?<=[A-Z])[^A-Z]+", "", NAMES$ID, perl = TRUE) 
#[1] "GW" 

oder ohne Lookarounds und Verwenden von Erfassungsgruppen. Wir fangen die Großbuchstaben als durch einen oder mehrere nicht Großbuchstaben gefolgt Gruppe und ersetzen Sie es mit dem Rückreferenzierung (\\1)

gsub("([A-Z])[^A-Z]+", "\\1", NAMES$ID) 
#[1] "GW" 

nur um sicher zu sein, wir können auch die Wortgrenze umfassen

gsub("(\\b[A-Z])[^A-Z]+", "\\1", NAMES$ID) 
+1

Wenn ich meine Benchmark und meine erste scheinen die schnellste. – SCDCE

+0

@Seth Vielen Dank für die Kommentare. Der Grund könnte sein, dass es in Ihrem Code mehrere Funktionen gibt, die den Prozess verlangsamen könnten – akrun

Verwandte Themen