Вот пример подхода, который вы можете использовать и улучшить. Вы, вероятно, должны сделать регулярное выражение более устойчивым - хотя это работает для вашего примера, я вижу ситуации, когда оно может потерпеть неудачу. Кроме того, это работает в течение 2000 лет и выше;вам нужно будет изменить его, если у вас есть более ранние даты. Дайте знать, если у вас появятся вопросы!
# Getting month indices
# Extracting month names
new_mon <- gsub(paste0(".*(", paste(c(month.name, month.abb), collapse = "|"), ").*"), "\\1", names(ldf))
# Subsetting a "quarter" vector by month name/abbreviation and taking nonmissing values
new_mon <- pmax(sort(rep(1:4, 3))[match(new_mon, month.name)],
sort(rep(1:4, 3))[match(new_mon, month.abb)], na.rm = T)
# Getting the year indices and ading "20" if there are only two characters
new_year <- gsub(".*?([0-9]{2,4}).*", "\\1", names(ldf)) # This is good for your example but you can make it more robust
new_year <- ifelse(nchar(new_year) == 2, paste0("20", new_year), new_year)
# Pasting them Together
new_cols <- paste0(new_year, " Q", new_mon)
Результаты :
# Adding the columns using Map
Map(function(x, y) cbind(x, "new_column" = y), ldf, new_cols)
$`April 2018 ASP NDC-HCPCS Crosswalk`
first second new_column
1 1 1 2018 Q2
2 2 2 2018 Q2
3 3 3 2018 Q2
4 4 4 2018 Q2
5 5 5 2018 Q2
6 6 6 2018 Q2
7 7 7 2018 Q2
8 8 8 2018 Q2
9 9 9 2018 Q2
10 10 10 2018 Q2
$`Apr 2019 ASP Pricing File`
first second new_column
1 1 1 2019 Q2
2 2 2 2019 Q2
3 3 3 2019 Q2
4 4 4 2019 Q2
5 5 5 2019 Q2
6 6 6 2019 Q2
7 7 7 2019 Q2
8 8 8 2019 Q2
9 9 9 2019 Q2
10 10 10 2019 Q2
$`Jan 18 ASP Pricing File`
first second new_column
1 1 1 2018 Q1
2 2 2 2018 Q1
3 3 3 2018 Q1
4 4 4 2018 Q1
5 5 5 2018 Q1
6 6 6 2018 Q1
7 7 7 2018 Q1
8 8 8 2018 Q1
9 9 9 2018 Q1
10 10 10 2018 Q1
Данные :
df<- data_frame(first =seq(1:10), second = seq(1:10))
ldf <- list(df, df, df)
names(ldf) <- c('April 2018 ASP NDC-HCPCS Crosswalk', 'Apr 2019 ASP Pricing File', 'Jan 18 ASP Pricing File')