通常需要将全名(和标题等)分成多列,按“姓氏”的字母顺序对行进行排序。当单个列包含全名时,我从来没有遇到过在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库都将被接受。谢谢!
答案 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
。这也比gsub
或str_replace
简单一些,因为您不必用""
替换字符串的捕获部分。
library(tidyverse)
library(stringr)
data %>%
arrange(str_extract(Names,'\\s.*$'))