gtools::mixedsort
представляется наиболее подходящим решением, но ниже я добавил код, который доставит вас в то же место без использования специализированной библиотеки ... код может быть переработан в других ситуациях ...
Определите следующую функцию и в сочетании с sapply
примените функцию к именам столбцов.Это даст вам матрицу числовых значений для сортировки: первая строка соответствует значению рядом с «V» в имени столбца, а вторая строка соответствует числу после «_» в имени столбца.
> convert_Name_To_Numbers <- function(x){
+ tempVec <- strsplit(x, "_")[[1]]
+ resultVec <- c(gsub("V","", tempVec[1]),
+ ifelse(is.na(tempVec[2]),"0", tempVec[2]))
+ return(as.double(resultVec))
+ }
> sortVec <- sapply(names(df), convert_Name_To_Numbers)
> sortVec
V1 V1_1 V1_10 V1_2 V2
[1,] 1 1 1 1 2
[2,] 0 1 10 2 0
Далее используйте order
, чтобы переупорядочить имена столбцов, используя эти две строки, то есть сначала сортировку по 1-й строке, а затем по значениям 2-й строки.
> newColumns <- names(df)[order(sortVec[1,], sortVec[2,])]
> newColumns
[1] "V1" "V1_1" "V1_2" "V1_10" "V2"
Надеюсь, все ясночто код можно легко настроить для работы с более сложными именами столбцов, где требуется более двух критериев сортировки, например, V1, V1_1, V1_1_1, V_1_2, ...