我正在尝试通过使用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)
使用data.table
library(data.table)
dummydf = data.table(dummydf)
dummydf[gtools::mixedorder(as.character(sortcol))]
Run Code Online (Sandbox Code Playgroud)
老实说,只是复制了您的示例并将其作为语法中的 select 参数插入data.table。您已经完成了所有艰苦的工作:)。
这是一个利用神秘身份的功能解决方案order(order(x)) == rank(x)。
mixedrank = function(x) order(gtools::mixedorder(x))
dummydf %>% dplyr::arrange(mixedrank(sortcol))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1298 次 |
| 最近记录: |