如何使用 dplyr::relocate 一步重新定位多个列?

Tea*_*ree 10 r dplyr

我想使用 dplyr::relocate 对某些列重新排序,使其位于特定的其他列之后。这是一个 MWE:

a <- letters[1:3]
b <- letters[4:6]
c <- letters[7:9]
d <- letters[10:12]

mytib <- tibble::tibble(a,b,c,d)

#  A tibble: 3 x 4
#  a     b     c     d    
#  <chr> <chr> <chr> <chr>
# 1 a     d     g     j    
# 2 b     e     h     k    
# 3 c     f     i     l    

mytib %>%
     relocate(c, .after = a)
Run Code Online (Sandbox Code Playgroud)

这个例子有效,但是有没有一种方法可以通过一个重定位命令将 c 移到 a 之后,例如将 d 移到 b 之后?

我尝试了以下操作但没有成功:

mytib %>%
     relocate(c(c, d), .after(c(a, b)))
Run Code Online (Sandbox Code Playgroud)

编辑1:我明确询问relocate,因为像这样的函数select不适用于大型数据集,我所知道的是在我想要插入列的哪一列(名称)之后。

编辑2:这是我的预期输出:

#  A tibble: 3 x 4
#  a     c     b     d    
#  <chr> <chr> <chr> <chr>
# 1 a     g     d     j    
# 2 b     h     e     k    
# 3 c     i     f     l   
Run Code Online (Sandbox Code Playgroud)

ale*_*b90 5

由于dplyr::relocate其本身显然不允许成对重新定位,因此您可以通过准备列对列表来“破解”此行为,例如您所描述的列对列表(“a 之后的 c”和“b 之后的 d”)并在reduce该列表上传递您的df 作为一个.init值,并在每个归约步骤中重新定位一对。

像这样:

library(dplyr)
library(purrr)

df_relocated <- reduce(
  .x = list(c('c','a'), c('d','b')), 
  .f = ~ relocate(.x, .y[1], .after = .y[2]),
  .init = mytib
)
Run Code Online (Sandbox Code Playgroud)

这会产生一个小标题,正如您所期望的那样:

> df_relocated
# A tibble: 3 x 4
  a     c     b     d    
  <chr> <chr> <chr> <chr>
1 a     g     d     j    
2 b     h     e     k    
3 c     i     f     l
Run Code Online (Sandbox Code Playgroud)