2013-10-11 11 views
5

sagen, dass ich einen Vektor der Völker Namen in meiner Datenrahmen haben:Extrahieren Vornamen in R

names <- c("Bernice Ingram", "Dianna Dean", "Philip Williamson", "Laurie Abbott", 
      "Rochelle Price", "Arturo Fisher", "Enrique Newton", "Sarah Mann", 
      "Darryl Graham", "Arthur Hoffman") 

ich einen Vektor mit den ersten Namen erstellen möchten. Alles, was ich über sie weiß, ist, dass sie in dem obigen Vektor zuerst kommen und dass ihnen ein Leerzeichen folgt. Mit anderen Worten ist es das, was ich suche:

"Bernice" "Dianna" "Philip" "Laurie" "Rochelle" 
"Arturo" "Enrique" "Sarah" "Darryl" "Arthur" 

Ich habe eine ähnliche Frage gefunden here, aber die Antworten (vor allem this one) haben nicht viel geholfen. Bis jetzt habe ich ein paar Variationen der Funktion aus dem grep family versucht, und die nächste, die ich zu etwas nützlichem bekommen konnte, war, strsplit(names, " ") zu laufen, um Vornamen und dann strsplit(names, " ")[[1]][1] zu trennen, um nur den Vornamen der ersten Person zu erhalten. Ich habe versucht, diesen letzten Befehl zu optimieren, um mir einen ganzen Vektor von Vornamen zu geben, ohne Erfolg.

Antwort

10

Verwenden sapply den Vornamen zu extrahieren:

> sapply(strsplit(names, " "), `[`, 1) 
[1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" 
[8] "Sarah" "Darryl" "Arthur" 

Einige Kommentare:

Die oben funktioniert gut. Um es etwas allgemeiner zu machen, könnten Sie den split Parameter in strsplit Funktion von " " in "\\s+" ändern, die mehrere Räume abdeckt. Dann könnten Sie auch gsub verwenden, um alles direkt vor einem Leerzeichen zu extrahieren. Dieser letzte Ansatz verwendet nur einen Funktionsaufruf und ist wahrscheinlich schneller (aber ich habe keinen Vergleich mit dem Benchmark).

3

Dies scheint zu funktionieren:

unlist(strsplit(names,' '))[seq(1,2*length(names),2)] 

kein Vor-/Nachname Leerstellen enthält Unter der Annahme.

3

Mit RegExpr auf gsub

> gsub("^(.*?)\\s.*", "\\1", names) 
[1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" "Sarah" 
[9] "Darryl" "Arthur" 
+2

oder 'sub ('*', '', Namen)' – eddi

5

Für das, was Sie wollen, hier ist eine ziemlich unorthodoxe Art und Weise, es zu tun:

read.table(text = names, header = FALSE, stringsAsFactors=FALSE, fill = TRUE)[[1]] 
# [1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" "Sarah" 
# [9] "Darryl" "Arthur" 
+0

schön! und wenn jemand einen zweiten Namen hat, würde ich vorschlagen, 'fill = T' zu setzen :) – Michele

+0

@Michele, Thanks. Das hatte ich mir vorgenommen, aber beim Posten vergessen. Wird jetzt aktualisiert. – A5C1D2H2I1M1N2O1R2T1

Verwandte Themen