如何做通用订单

时间:2018-01-11 09:07:44

标签: r

我有一个数据库作为数据框,我想订购所有列,但保持元素之间的关系。 例如,如果我执行以下操作:

> DF
   A B   C D
1 11 2 432 4
2 11 3 432 4
3 13 4 241 5
4 42 5   2 3
5 51 5 332 2
6 51 5 332 1
7 51 5 332 1
> DF=DF[order(A,B,C,D),]
> DF
   A B   C D
1 11 2 432 4
2 11 3 432 4
3 13 4 241 5
4 42 5   2 3
6 51 5 332 1
7 51 5 332 1
5 51 5 332 2

好的,这就是我想要的(注意最后两行),但我希望有一个通用的解决方案,与列数无关。我尝试了以下方法,但它不起作用。

> DF=DF[order(colnames(DF)),]
> DF
   A B   C D
1 11 2 432 4
2 11 3 432 4
3 13 4 241 5
4 42 5   2 3

如果有人能帮我解决这个小问题,我将不胜感激。问候。

1 个答案:

答案 0 :(得分:4)

我们可以将do.callorder一起用于对数据集的所有列进行排序

DF[do.call(order, DF),]

如果我们使用tidyverse,则arrange_at将采用列名称

library(dplyr)
DF %>%
    arrange_at(vars(names(.)))
    #or as @Sotos commented
    #arrange_all()
    #or
    #arrange(!!! rlang::syms(names(.)))
#   A B   C D
#1 11 2 432 4
#2 11 3 432 4
#3 13 4 241 5
#4 42 5   2 3
#5 51 5 332 1
#6 51 5 332 1
#7 51 5 332 2