Добавить «\-» все буквы «x» строкового вектора

#r #string #date #format

#r #строка #Дата #форматировать

Вопрос:

У меня есть вектор даты, подобный этому

 date <- c("01jan2020", "04mar2020", "20dec2020")
  

и я хочу отделить его с помощью — следуя следующему шаблону (после первых 2 цифр и после первых 5 цифр):

 date_transform1 <- c("01-jan-2020", "04-mar-2020", "20-dec-2020")
  

Затем я хочу преобразовать первую букву месяца в заглавную букву:

 date_transform2 <- c("01-Jan-2020", "04-Mar-2020", "20-Dec-2020")
  

Есть какие-нибудь подсказки?

С уважением

Ответ №1:

Опция с lubridate и format

 library(lubridate)
format(dmy(date), "%d-%b-%Y")
#[1] "01-Jan-2020" "04-Mar-2020" "20-Dec-2020"
  

Ответ №2:

Вы можете попробовать этот подход, разделив свою текстовую цепочку на несколько компонентов:

 #Data
date <- c("01jan2020", "04mar2020", "20dec2020")
#Extract first element
x1 <- substr(gsub("[^0-9.-]", "", date),1,2)
#Extract second element
x2 <- substr(gsub("[^0-9.-]", "", date),nchar(gsub("[^0-9.-]", "", date))-3,
             nchar(gsub("[^0-9.-]", "", date)))
#Format month
x3 <- gsub('[[:digit:]] ', '', date)
x3 <- paste(toupper(substr(x3, 1, 1)), substr(x3, 2, nchar(x3)), sep="")
#Now concatenate
xf <- paste0(x1,'-',x3,'-',x2)
  

Вывод:

 [1] "01-Jan-2020" "04-Mar-2020" "20-Dec-2020"
  

Ответ №3:

Вы можете преобразовать character объект в Date и изменить его формат.

 format(as.Date(date, "%d%b%Y"), "%d-%b-%Y")

# [1] "01-Jan-2020" "04-Mar-2020" "20-Dec-2020"
  

Первые буквы месяцев будут преобразованы в заглавные. Вы также можете использовать dmy() from lubridate или anydate() from anytime для разбора Date объектов.

 format(lubridate::dmy(date), "%d-%b-%Y")
format(anytime::anydate(date), "%d-%b-%Y")
  

Другой вариант с stringr пакетом:

 library(stringr)

str_replace(date, "[a-z] ", function(x) sprintf("-%s-", str_to_title(x)))

# [1] "01-Jan-2020" "04-Mar-2020" "20-Dec-2020"
  

или

 str_replace(date, "[a-z] ", function(x) str_pad(str_to_title(x), 5, "both", "-"))

# [1] "01-Jan-2020" "04-Mar-2020" "20-Dec-2020"
  

Комментарии:

1. Суперэффективно. Спасибо

2. Вы правы, что ваш пришел первым. Однако я обнаружил, что код @akrun более интуитивно понятен и лучше вписывается в мой код и в структуру «dplyr» (по крайней мере, таково мое восприятие, когда я попробовал два кода). Ваш вклад был очень ценным для меня, и я действительно ценю это. Еще раз спасибо