Здесь можно начать с чего-то, и его легко масштабировать. Используя gsub
и группировку, мы можем разделить вашу строку на 3 части, разделенные _, что поможет нам позже, когда мы используем tidyr::separate
, чтобы получить Y, M и D
> gsub('(\\d{2})([A-Z])(\\d{2})','\\1_\\2_\\3',"73C23")
[1] "73_C_23"
library(dplyr)
library(tidyr)
df %>% mutate(X1= gsub('(\\d{2})([A-Z])(\\d{2})','\\1_\\2_\\3',X)) %>%
separate(X1,sep = '_',into = c('Year','Month','Day')) %>%
mutate(
Month=case_when(Month=='A' ~ 'Jan',
Month=='B' ~ 'Feb',
Month=='R' ~ 'Oct',
TRUE ~ NA_character_),
Year=if_else(Year>18, paste0(19,Year),paste0(20,Year)),
Day=if_else(gsub('.*([A-Z])$','\\1',Y)=='M',as.numeric(Day)-40,as.numeric(Day)-30)
)
Данные
df <- data.frame(X=c("78R58","62R31","62M26",NA),
Y=c("GFNNTN78R58G812M","GFNNTN78R58G812F","GFNNTN78R58G812M",NA))