如何解决使用dplyr通过两个字母数字列对表进行排序
我有一个看起来像这样的数据集:
library(dplyr)
Data <- tibble(
Area1 = rep(c("A1 1AA","B3 4TT","D1 1AA","A10 6TY","A2 9GG"),2),Area2 = c("A2 7BB","B11 5TT","A14 9SS","A4 4HH","V6 9FF","A11 6TT","B4 3DD","D1 4FF","G5 7DD","A2 7YY"))
我想先按Area1
然后再按Area2
对其进行排序,但是arrange
不能产生期望的结果,因为它是按字典顺序排列的。
Data %>% arrange(Area1,Area2) #not the desired order
有没有一种方法可以使用dplyr
来生成所需顺序的输出?
Output <- tibble(
Area1 = c("A1 1AA","A1 1AA","A2 9GG","D1 1AA"),"A2 7YY","D1 4FF"))
解决方法
好像我们可以将mixedorder
与slice
一起使用
library(dplyr)
library(gtools)
library(stringr)
Output2 <- Data %>%
slice(mixedorder(str_c(Area1,Area2)))
或者另一种选择是分别删除非数字数值,并在arrange
Output3 <- Data %>%
arrange(str_remove_all(Area1,"\\d+"),readr::parse_number(Area1),str_remove_all(Area2,readr::parse_number(Area2))
-根据OP的预期进行检查
identical(Output,Output2)
#[1] TRUE
identical(Output,Output3)
#[1] TRUE
,
这是使用arrange()
和str_sort()
的另一个选项:
library(dplyr)
library(stringr)
Data %>%
arrange(across(starts_with("Area"),~match(.x,str_sort(unique(.x),numeric = TRUE))))
# A tibble: 10 x 2
Area1 Area2
<chr> <chr>
1 A1 1AA A2 7BB
2 A1 1AA A11 6TT
3 A2 9GG A2 7YY
4 A2 9GG V6 9FF
5 A10 6TY A4 4HH
6 A10 6TY G5 7DD
7 B3 4TT B4 3DD
8 B3 4TT B11 5TT
9 D1 1AA A14 9SS
10 D1 1AA D1 4FF