如何按包含特殊符号 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
我有以下数据框:
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