Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按R中的字母顺序对全名排序_R_Sorting_Tidyr - Fatal编程技术网

按R中的字母顺序对全名排序

按R中的字母顺序对全名排序,r,sorting,tidyr,R,Sorting,Tidyr,全名(和标题等)通常需要分成多个列,以便按“姓氏”按字母顺序对行进行排序。在SQL中,当一列包含全名时,我从未遇到过一种简单的方法来实现这一点 然而,我知道R有数千个库——尽管我没有遇到过任何不将名字、姓氏和标题分成各自的列就能做到这一点的例子——我想我应该看看是否有更有效的方法来处理这种情况 我正在使用的数据集只有一列全名为。例如: Names 1 Robert Johnson 2 Billy Joel

全名(和标题等)通常需要分成多个列,以便按“姓氏”按字母顺序对行进行排序。在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
库(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.*$'))