在R中按字母顺序排序全名

Sort full name in alphabetical order in R

全名(和标题等)通常需要分成多列才能按字母顺序对行进行排序 "last name." 我在 SQL 中从未遇到过实现此目的的简单方法当单个列包含全名时。

但是,我知道 R 有数以千计的库——虽然我还没有遇到任何可以做到这一点的例子没有将名字、姓氏和标题分开他们各自的专栏 - 我想我会看看是否有更有效的方法来处理这种情况。

我正在处理的数据集只有一列 全名。例如:

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

我需要在不创建额外列的情况下按字母顺序对这些进行排序。到目前为止,我不确定这是否可行,但我确实找到了一个相对无痛的 work-around。值得庆幸的是,每个名称都遵循 "first name"(space)"last name" 约定。所以我可以使用 tidyr 库中的 separate() 来轻松隔离姓氏:

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

然后我可以使用 arrange() 按字母顺序对新的 "last name" 列进行排序,并立即使用 unite() 重建原始列:

# 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=' ')

这成功重建了原始 table 并通过姓氏将列 "Names" 按字母顺序排列。有没有另一种方法可以实现这个 without 曾经(甚至是暂时)创建第二个 "last name" 列?任何额外的 R 库都将被接受。谢谢!

您可以使用 dplyr 和一个简单的 gsub 调用来完成此操作。

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

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

此处使用的 tidyverse 函数是 stringr 包中的 str_extract。这也比 gsubstr_replace 简单一点,因为您不必将捕获的字符串部分替换为 "".

library(tidyverse)
library(stringr)

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