按自定义数字模式对变量名称进行排序

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

我有以下数据集:

df <- structure(list(a3_1_1 = 0, a3_1_2 = 0, a3_1_3 = 0, a3_1_4 = 0, 
    a3_1_5 = 0, a3_1_6 = 0, a3_1_7 = 0, a3_1_8 = 0, a3_1_9 = 0, 
    a3_1_10 = 0, a3_1_11 = 0, a3_1_12 = 0, a3_1_13 = 0, a3_1_14 = 0, 
    a3_1_15 = 0, a3_1_16 = 0, a3_1_17 = 0, a3_2_1 = 0, a3_2_2 = 0, 
    a3_2_3 = 0, a3_2_4 = 0, a3_2_5 = 0, a3_2_6 = 0, a3_2_7 = 0, 
    a3_2_8 = 0, a3_2_9 = 0, a3_2_10 = 0, a3_2_11 = 0, a3_2_12 = 0, 
    a3_2_13 = 0, a3_2_14 = 0, a3_2_15 = 0, a3_2_16 = 0, a3_2_17 = 0, 
    a3_3_1 = 0, a3_3_2 = 0, a3_3_3 = 0, a3_3_4 = 0, a3_3_5 = 0, 
    a3_3_6 = 0, a3_3_7 = 0, a3_3_8 = 0, a3_3_9 = 0, a3_3_10 = 0, 
    a3_3_11 = 0, a3_3_12 = 0, a3_3_13 = 0, a3_3_14 = 0, a3_3_15 = 0, 
    a3_3_16 = 0, a3_3_17 = 0), row.names = c(NA, -1L), class = "data.frame")

我有许多变量,它们是具有相同变量名称数字模式的表的一部分。我正在寻找某种安排:第二个数字应该作为一个组排列在最后一个数字内。这样,我想创建一个函数,将第一个和最后一个变量作为参数,并以这种方式排列它们。所需的输出应该是这样的:

ordered_df <- structure(list(a3_1_1 = 0, a3_2_1 = 0, a3_3_1 = 0, a3_1_2 = 0, 
    a3_2_2 = 0, a3_3_2 = 0, a3_1_3 = 0, a3_2_3 = 0, a3_3_3 = 0, 
    a3_1_4 = 0, a3_2_4 = 0, a3_3_4 = 0, a3_1_5 = 0, a3_2_5 = 0, 
    a3_3_5 = 0, a3_1_6 = 0, a3_2_6 = 0, a3_3_6 = 0, a3_1_7 = 0, 
    a3_2_7 = 0, a3_3_7 = 0, a3_1_8 = 0, a3_2_8 = 0, a3_3_8 = 0, 
    a3_1_9 = 0, a3_2_9 = 0, a3_3_9 = 0, a3_1_10 = 0, a3_2_10 = 0, 
    a3_3_10 = 0, a3_1_11 = 0, a3_2_11 = 0, a3_3_11 = 0, a3_1_12 = 0, 
    a3_2_12 = 0, a3_3_12 = 0, a3_1_13 = 0, a3_2_13 = 0, a3_3_13 = 0, 
    a3_1_14 = 0, a3_2_14 = 0, a3_3_14 = 0, a3_1_15 = 0, a3_2_15 = 0, 
    a3_3_15 = 0, a3_1_16 = 0, a3_2_16 = 0, a3_3_16 = 0, a3_1_17 = 0, 
    a3_2_17 = 0, a3_3_17 = 0), row.names = c(NA, -1L), class = "data.frame")

我正在寻找的解决方案应该使用

dplyr::arrange
,但我显然愿意接受建议。

my_arranger <- function(df, from = col1, to = col2){
df %>% arrange({{col1}}:{{col2}}) #Here should make the above requested arrangement
}
r dplyr
1个回答
0
投票

您可以尝试以下代码

nms <- names(df)

d2 <- as.integer(gsub(".*_(\\d+)_.*", "\\1", nms))
d3 <- as.integer(gsub(".*_(\\d+)$", "\\1", nms))

nms[order(d3, d2)]
© www.soinside.com 2019 - 2024. All rights reserved.