в R, как вы сортируете имя строкового столбца с "_" в нем - PullRequest
1 голос
/ 19 сентября 2019

У меня есть эти данные,

df <- data.frame(V1= c("SF", "SF", "NYC"),
    V1_1 = c(1990, 2000, 1990),
    V1_10 = 1:3, V1_2 = 1:3, V2 = 1:3)

Я хочу, чтобы это было в порядке

V1, V1_1, V1_2, V1_10, V2

Я пробовал несколько разных способов, но они не привели, как указано выше.

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Мы можем использовать mixedsort или mixedorder от gtools

gtools::mixedsort(names(df))
#[1] "V1"    "V1_1"  "V1_2"  "V1_10" "V2"   

df[gtools::mixedsort(names(df))]
1 голос
/ 19 сентября 2019

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, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...