如何按包含特殊符号 R 的名称对列进行排序

how to order columns by names containing special symbols R

我有以下数据框:

df <- data.frame(aa = rep(1,4),
                ae = rep(2,4),
                dd = rep(3,4),
                `aa%` = rep(11,4),
                `ae%` = rep(22,4),
                `dd%` = rep(33,4))

  aa ae dd aa. ae. dd.
1  1  2  3  11  22  33
2  1  2  3  11  22  33
3  1  2  3  11  22  33
4  1  2  3  11  22  33

我想将列排序为

  aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33

我也是

library(dplyr)
library(gtools)
df %>%
  select(1, mixedorder(names(.)[-1]))

但这给了

  aa dd aa. ae ae.
1  1  3  11  2  22
2  1  3  11  2  22
3  1  3  11  2  22
4  1  3  11  2  22

如何获得具有所需列顺序的输出?

使用mixedsort代替mixedorder

library(gtools)
library(dplyr)
df %>%
    select(mixedsort(names(.)))
   aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33


删除第一列后 mixedorder 的问题是它 returns 一个从 1 开始的索引,需要从 2 开始,即加 1

df %>%
   select(1, mixedorder(names(.)[-1])+1)
  aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33

可能的解决方案:

library(dplyr)

df %>% 
  select(sort(names(.)))

#>   aa aa. ae ae. dd dd.
#> 1  1  11  2  22  3  33
#> 2  1  11  2  22  3  33
#> 3  1  11  2  22  3  33
#> 4  1  11  2  22  3  33

更简单的方法:

 df[,order(colnames(df))] 

  aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33

有了 dplyr 我们可以:

library(dplyr)

df %>% select(order(colnames(df)))
  aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33

另一个选项:

library(dplyr)
df %>% 
  select(sort(tidyselect::peek_vars()))

输出:

  aa aa. ae ae. dd dd.
1  1  11  2  22  3  33
2  1  11  2  22  3  33
3  1  11  2  22  3  33
4  1  11  2  22  3  33