在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
。这也比 gsub
或 str_replace
简单一点,因为您不必将捕获的字符串部分替换为 ""
.
library(tidyverse)
library(stringr)
data %>%
arrange(str_extract(Names,'\s.*$'))
全名(和标题等)通常需要分成多列才能按字母顺序对行进行排序 "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
。这也比 gsub
或 str_replace
简单一点,因为您不必将捕获的字符串部分替换为 ""
.
library(tidyverse)
library(stringr)
data %>%
arrange(str_extract(Names,'\s.*$'))