使用 gtools::mixedsort 或 dplyr::arrange 的替代品

FM *_*hof 6 r dplyr

我正在尝试通过使用dplyr::arrange. 问题是我试图排序的列包含一个固定字符串后跟一个数字,例如由下面的 dummycode 生成。

  dummydf<-data.frame(values=rnorm(100),sortcol=paste0("ABC",sample(1:100,100,replace=FALSE)))
Run Code Online (Sandbox Code Playgroud)

默认情况下, usingdummydf %>% arrange(sortcol)会生成一个按字母数字 (?) 排序的 df ,但这当然不是所需的结果:

values sortcol
0.708081720    ABC1
0.041348322   ABC10
1.730962886  ABC100
0.423480861   ABC11
-1.545837266   ABC12
-1.345539947   ABC13
-0.078998792   ABC14
0.088712174   ABC15
0.670583024   ABC16
1.238837680   ABC17
-1.459044293   ABC18
-2.028535223   ABC19
0.779514385    ABC2
1.360509910   ABC20
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想对列进行排序gtools::mixedsort,确保 ABC2 跟在 ABC1 之后,并且前面没有 ABC1-19 和 ABC100mixedsort(as.character(dummydf$sortcol))会做到这一点。

现在,我知道我可以通过sub在我的arrange论点中使用来做到这一点:dummydf %>% arrange(as.numeric(sub("ABC","",sortcol)))但这主要是因为我的字符串是固定的(尽管任何正则表达式都可以用于捕获我认为的任何字符串后面的最后一位数字)。

我只是想知道:是否有一种更“优雅”和通用的方式来完成这件事dplyr::arrange,就像gtools::mixedsort

亲切的问候,

调频

小智 8

我没有看到这个答案,所以我会把它扔掉。您可以使用 mixorder 和 slice 来排列它。

dummydf %>% 
  slice(mixedorder(sortcol))
Run Code Online (Sandbox Code Playgroud)


Akh*_*air 5

使用data.table

library(data.table)
dummydf = data.table(dummydf)
dummydf[gtools::mixedorder(as.character(sortcol))]
Run Code Online (Sandbox Code Playgroud)

老实说,只是复制了您的示例并将其作为语法中的 select 参数插入data.table。您已经完成了所有艰苦的工作:)。


eri*_*eld 5

这是一个利用神秘身份的功能解决方案order(order(x)) == rank(x)

mixedrank = function(x) order(gtools::mixedorder(x))
dummydf %>% dplyr::arrange(mixedrank(sortcol))
Run Code Online (Sandbox Code Playgroud)