gsub добавить начальный ноль к выбранным числам в тексте имен столбцов, чтобы помочь в сортировке - PullRequest
1 голос
/ 12 апреля 2019

У меня есть датафрейм, извлеченный из внешнего источника с метками столбцов, основанными на количестве года и недели. К сожалению, столбцы вытягиваются в странном непоследовательном порядке (особенность внешнего набора данных), и поэтому, когда я сообщаю о них, я хочу извлечь столбцы, используя «select», чтобы получить их в порядке следования по дате.

Я хочу вставить ноль перед однозначными метками столбца ниже - то есть «W1_2019» становится «W01_2019» (и т. Д. Для 2, 3 и до 9), но не перед двойным цифры - то есть "" W10_2019 "останутся как есть. Получившийся столбец должен позволить мне упорядочить имена (df) в порядке возрастания, с W01, за которыми следуют W02 и W03. Без нулей, конечно, порядок W1, затем W10, а затем W2 - это именно то, чего я не хочу.

См. Код ниже.

df<-setNames(
  data.frame(
  t(data.frame(c("1","2","1","3","2","3", "1")))
  ,row.names = NULL,stringsAsFactors = FALSE
  ), 
  c("W10_2018", "W50_2018", "W51_2018", "W52_2018", "W1_2019", "W2_2019", "W3_2019")
  )

names(df) = gsub(pattern="W#_.*", replacement = "W0#_", x=names(df))

sort(names(df))

Строка gsub не возвращает ошибку, но также не меняет имена. В результате получается строка «sort»:

[1] "W1_2019" "W10_2018" "W2_2019" "W3_2019" "W50_2018" "W51_2018" "W52_2018"

Как это должно выглядеть в случае успеха:

[1] "W01_2019" "W02_2019" "W03_2019" "W10_2018" "W50_2018" "W51_2018" "W52_2018"

1 Ответ

3 голосов
/ 12 апреля 2019

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

library(gtools)
mixedsort(names(df))
#[1] "W1_2019"  "W2_2019"  "W3_2019"  "W10_2018" "W50_2018" "W51_2018" "W52_2018"

Если нам нужна согласованность, то есть 2 цифры после 'W', внесите некоторые изменения с помощью sub. Возьмите одну цифру, которая следует за «W» и перед «_» в качестве группы захвата (2 цифры не будут сопоставлены), затем при замене «W», за которой следует цифра 0, а затем обратная ссылка на захваченную группу (\\1) и _ и должно работать

mixedsort(sub("W(\\d{1})_", "W0\\1_", names(df)))
#[1] "W01_2019" "W02_2019" "W03_2019" "W10_2018" "W50_2018" "W51_2018" "W52_2018"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...