Re-ordering 一个对称的小标题

Re-ordering a symmetric tibble

假设我们有一个如下所示的 tibble。理论上,第一列只是一个 rownames,它必须与列名有 one-on-one 对应。

例如,除去第一列(row_name),左起第三列的名称为G,但对应的行为E.

我想知道我们如何 re-order 行(例如,调出标题为 G 的行向上两行)以便行和列匹配?

out <- tibble(row_name=factor(c("A","B","E","F","G")),`A`=as.character(1:5),`B`=as.character(c(2,NA,0:2)),
`G`=as.character(4:8),`E`=as.character(4:8),`F`=as.character(4:8))


#  row_name A     B     G     E     F    
#  <fct>    <chr> <chr> <chr> <chr> <chr>
#1 A        1     2     4     4     4    
#2 B        2     NA    5     5     5    
#3 E        3     0     6     6     6    
#4 F        4     1     7     7     7    
#5 G        5     2     8     8     8


# EXPECTED OUTPUT:

#  row_name A     B     G     E     F    
#  <fct>    <chr> <chr> <chr> <chr> <chr>
#1 A        1     2     4     4     4    
#2 B        2     NA    5     5     5
#5 G        5     2     8     8     8
#3 E        3     0     6     6     6    
#4 F        4     1     7     7     7   

如果我们想对行重新排序,请在 slice

中使用 match
library(dplyr)
out %>%
   slice(match(names(.)[-1], row_name))

-输出

# A tibble: 5 x 6
  row_name A     B     G     E     F    
  <fct>    <chr> <chr> <chr> <chr> <chr>
1 A        1     2     4     4     4    
2 B        2     <NA>  5     5     5    
3 G        5     2     8     8     8    
4 E        3     0     6     6     6    
5 F        4     1     7     7     7  

或在arrange

之内
out %>% 
    arrange(factor(row_name, levels = names(.)[-1]))

-输出

# A tibble: 5 x 6
  row_name A     B     G     E     F    
  <fct>    <chr> <chr> <chr> <chr> <chr>
1 A        1     2     4     4     4    
2 B        2     <NA>  5     5     5    
3 G        5     2     8     8     8    
4 E        3     0     6     6     6    
5 F        4     1     7     7     7