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



全名(和头衔等(通常需要分成多列,以按"姓氏"的字母顺序对行进行排序。当单个列包含全名时,我从未遇到过在SQL中实现此目的的简单方法。

但是,我知道 R 有数千个库 - 虽然我还没有遇到任何示例可以在不将名字、姓氏和标题分隔到各自的列中的情况下做到这一点 - 我想我会看看是否有更有效的方法来处理这种情况。

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

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

我需要按字母顺序对这些内容进行排序,而无需创建其他列。 到目前为止,我不确定这是否可能,但我确实找到了一个相对无痛的解决方法。 值得庆幸的是,每个名字都遵循"名字"(空格("姓氏"约定。 所以我可以使用tidyr库中的 separ(( 来轻松隔离姓氏:

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 库。 谢谢!

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

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

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

最新更新