2017-07-17 10 views
3

Vollständige Namen (und Titel usw.) müssen in der Regel in mehrere Spalten aufgeteilt werden, um Zeilen alphabetisch nach "Nachname" zu sortieren. Ich habe noch nie einen einfachen Weg gefunden, dies in SQL zu erreichen, wenn eine einzelne Spalte den vollständigen Namen enthält.Sortieren Sie den vollständigen Namen in alphabetischer Reihenfolge in R

Allerdings weiß ich, R hat Tausende von Bibliotheken - und obwohl ich keine Beispiele gefunden habe, die ohne den Vornamen, Nachnamen und Titel in ihre eigenen Spalten trennen können - dachte ich, ich ' Ich sehe, ob es einen etwas effizienteren Weg gibt, mit dieser Situation umzugehen.

Der Datensatz, mit dem ich arbeite, hat eine einzelne Spalte mit vollständigen Namen. Zum Beispiel:

 Names 
1 Robert Johnson         
2 Billy Joel        
3 Donald Fagen       
4 Trent Reznor         
5 Wolfgang Mozart 

Ich muss diese alphabetisch sortieren, ohne zusätzliche Spalten zu erstellen. Bisher bin ich mir nicht sicher, ob das möglich ist, aber ich fand eine relativ schmerzlose Arbeit. Zum Glück folgt jeder Name einer "Vorname" (Raum) "Nachname" Konvention. So kann ich trennen() aus der tidyr Bibliothek leicht Nachnamen isolieren:

library(tidyverse) 
library(magrittr) 

# Separate into "first name" and "last name" columns 
data %<>% separate(Names, c('first_name', 'last_name'), sep = ' ') 

    first_name  last_name 
1  Robert   Johnson          
2  Billy   Joel          
3  Donald   Fagen          
4  Trent   Reznor 
5  Wolfgang   Mozart 

Dann kann ich in alphabetischer Reihenfolge die neue „Nachnamen“ Spalte sortieren mit arrangieren() und sofort die ursprüngliche Spalte mit Vereinigen wieder aufbauen():

# Arrange rows alphabetically by last name 
data %<>% arrange(last_name) 

# Rebuild original column and dissolve temporary 2nd column 
data %>% unite(Names, first_name:last_name, sep=' ') 

Dies erstellt erfolgreich die ursprüngliche Tabelle und alphabetisch Spalte "Namen" über Nachnamen. Gibt es eine andere Möglichkeit, diese ohne jemals (auch vorübergehend) zu schaffen, die zweite Spalte "Nachname" zu erstellen? Alle zusätzlichen R-Bibliotheken würden akzeptiert werden. Vielen Dank!

Antwort

2

Die tidyverse Funktion hier wäre die Verwendung str_extract vom stringr Paket. Dies ist auch etwas einfacher als gsub oder str_replace, da Sie den erfassten Teil der Zeichenfolge nicht durch "" ersetzen müssen.

library(tidyverse) 
library(stringr) 

data %>% 
    arrange(str_extract(Names,'\\s.*$')) 
+0

Ja, funktioniert gut und reduziert den Code von 3 Zeilen auf 1. Danke! – RVD

2

Sie können dies mit dplyr und einem einfachen gsub Aufruf.

library(dplyr) 
data %>% 
    arrange(gsub(".*\\s", "", Names)) 

      Names 
1 Donald Fagen 
2  Billy Joel 
3 Robert Johnson 
4 Wolfgang Mozart 
5 Trent Reznor 
+0

Gute Lösung. Arbeitete an meinem Ende. Vielen Dank! – RVD

Verwandte Themen