按R中的字母顺序对全名排序
全名(和标题等)通常需要分成多个列,以便按“姓氏”按字母顺序对行进行排序。在SQL中,当一列包含全名时,我从未遇到过一种简单的方法来实现这一点 然而,我知道R有数千个库——尽管我没有遇到过任何不将名字、姓氏和标题分成各自的列就能做到这一点的例子——我想我应该看看是否有更有效的方法来处理这种情况 我正在使用的数据集只有一列全名为。例如:按R中的字母顺序对全名排序,r,sorting,tidyr,R,Sorting,Tidyr,全名(和标题等)通常需要分成多个列,以便按“姓氏”按字母顺序对行进行排序。在SQL中,当一列包含全名时,我从未遇到过一种简单的方法来实现这一点 然而,我知道R有数千个库——尽管我没有遇到过任何不将名字、姓氏和标题分成各自的列就能做到这一点的例子——我想我应该看看是否有更有效的方法来处理这种情况 我正在使用的数据集只有一列全名为。例如: Names 1 Robert Johnson 2 Billy Joel
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
库(tidyverse)
图书馆(magrittr)
#分为“名字”和“姓氏”两列
数据%%separate(名称,c('first_name','last_name'),sep='')
姓
罗伯特·约翰逊
2比利·乔尔
3唐纳德·法根
4特伦特·雷兹诺
5沃尔夫冈·莫扎特
然后,我可以使用arrange()按字母顺序对新的“last name”列进行排序,并立即使用unite()重新生成原始列:
#按姓氏字母顺序排列行
数据%%arrange(姓氏)
#重建原始列并解散临时第二列
数据%>%unite(姓名,名:姓,sep=“”)
这将成功地重建原始表,并通过姓氏按字母顺序排列列“名称”。没有
曾经(甚至暂时)创建过第二个“姓氏”列吗?任何额外的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
函数是stru extract
来自stringr
包。这也比gsub
或str\u replace
简单一些,因为您不必用“
替换字符串的捕获部分
很好的解决方案。在我这边工作。非常感谢。是的,非常有效,代码从3行减少到1行。谢谢
library(dplyr)
data %>%
arrange(gsub(".*\\s", "", Names))
Names
1 Donald Fagen
2 Billy Joel
3 Robert Johnson
4 Wolfgang Mozart
5 Trent Reznor
library(tidyverse)
library(stringr)
data %>%
arrange(str_extract(Names,'\\s.*$'))