我的数据集包含三列的集合:“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_"))
,但我找不到方法。
谢谢!
根本不是一句简单的话,所以我很好奇看到更简洁的方法。我在这里依赖于您希望每个组中的顺序是按时间倒序排列的;如果它更复杂,我会将其设为有序因子。
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}})