在R中按字母顺序对全名进行排序

时间:2017-07-17 20:10:25

标签: r sorting tidyr

通常需要将全名(和标题等)分成多列,按“姓氏”的字母顺序对行进行排序。当单个列包含全名时,我从来没有遇到过在SQL中实现此目的的简单方法。

但是,我知道R有数千个库 - 虽然我没有遇到任何可以执行此操作的示例没有将名字,姓氏和标题分隔到各自的列中 - 我想我会看看是否有更有效的方法来应对这种情况。

我正在使用的数据集有一列全名。例如:

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

我需要按字母顺序排序,而不创建其他列。到目前为止,我不确定这是可能的,但我确实找到了相对无痛的解决方法。值得庆幸的是,每个名称都遵循“名字”(空格)“姓氏”惯例。所以我可以使用 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()按字母顺序对新的“姓氏”列进行排序,并使用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=' ')

通过姓氏成功重建原始表格并按字母顺序排列“名称”列。是否有其他方法可以实现没有 曾经(甚至暂时)创建第二个“姓氏”专栏?任何其他R库都将被接受。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:2)

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

library(tidyverse)
library(stringr)

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