全名(和头衔等(通常需要分成多列,以按"姓氏"的字母顺序对行进行排序。当单个列包含全名时,我从未遇到过在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
。 这也比gsub
或str_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