重新排序对称小标题

标签 r function dplyr tidyverse tibble

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

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

我想知道如何重新排序行(例如,将标题为 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  

或者在排列

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   

关于重新排序对称小标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68910894/

相关文章:

r - 如何使用 purrr 将计算列添加到嵌套数据框(列表列)

r - pkgdown::build_site() 未在 HTML 渲染中捕获 R 包 Logo

performance - 使用内联会降低性能吗?

r - 计算值 1 之后的行,其中其余行在 r 中为 NA

PHP 类;通知: Undefined property error

python - 如何在 DataFrame 中创建和使用新函数?

r - 如何 left_join() 两个数据集但只从其中一个数据集中选择特定列?

从 Rcpp 中的列表中删除元素

r - Sparklyr 使用 case_when 和变量

r - 匹配和替换文本向量中的多个字符串,而不在 R 中循环