使用 tidyselect 动态列重定位

问题描述 投票:0回答:1

我的数据集包含三列的集合:“varn_name”、“varn_desc”和“varn_cats”,其中n是从1开始的连续整数序列。我喜欢对这些列进行排序,以便它们遵循此顺序(即“var1_name”、“var1_desc”、“var1_name”、“var2_name”、“var2_desc”等)。 n 在数据集之间有所不同,并且没有上限,因此我希望有一个解决方案能够适应这种变化。

输入数据示例(n最多 3):

# unsorted
dat <- structure(list(id_col = 1:2, var2_name = c("A", "B"), var1_cats = c("A", 
"B"), var3_desc = c("A", "B"), var3_cats = c("A", "B"), var3_name = c("A", 
"B"), var2_cats = c("A", "B"), var1_name = c("A", "B"), var1_desc = c("A", 
"B"), var2_desc = c("A", "B")), class = "data.frame", row.names = c(NA, 
-2L))

所需输出:

# sorted

#>   id_col var1_name var1_desc var1_cats var2_name var2_desc var2_cats var3_name
#> 1      1         A         A         A         A         A         A         A
#> 2      2         B         B         B         B         B         B         B
#>   var3_desc var3_cats
#> 1         A         A
#> 2         B         B

我似乎无法克服的挑战是我希望 n 组件(例如 var1)升序,但后缀组件(“_name”、“_desc”和“_cats”)不跟随按字母顺序。因此像这个这样的解决方案对我来说不太有效。

有简单的单衬吗?理想情况下使用

dplyr::relocate()
,这样我就可以利用
.after
参数(在本例中为
.after = id_col
)。我希望
tidyselect
助手能起作用,例如
relocate(dat, matches("^var\\d_"))
,但我找不到方法。

谢谢!

r dplyr tidyselect
1个回答
0
投票

根本不是一句简单的话,所以我很好奇看到更简洁的方法。我在这里依赖于您希望每个组中的顺序是按时间倒序排列的;如果它更复杂,我会将其设为有序因子。

library(tidyverse)
cols_sorted <- data.frame(colnames = names(dat)) |>
  separate(colnames, c("grp", "type")) |>
  arrange(grp, desc(type)) |>
  unite("colname", grp:type) |>
  pull()

dat |>
  select({{cols_sorted}})
© www.soinside.com 2019 - 2024. All rights reserved.