#r #regex-group
#r #регулярное выражение-группа
Вопрос:
Привет, у меня есть задача сортировки ежедневных часов работы в удобном формате, более похожем на часы работы Google, например:
Monday 06:00 - 18:00 Tuesday 08:00 - 18:00 ... Sunday Closed
Существует столбец часов работы 100K , но ниже приведен пример нерегулярных форматов. Я думал, что мог бы использовать регулярные выражения для использования групповых совпадений и назначать, где они найдены, но я не могу найти способ не использовать групповое совпадение, когда они отсутствуют.
Times lt;- data.frame(opening_hours = c("Su 09:00-17:00,M-S 08:00-20:00", "Su-S 06:00-23:59", "Su-S 08:00-22:00", "Su 08:00-22:00,M-F 08:30-22:00,S 08:00-22:00", "Su-S 00:00-23:59", "M-F 08:00-22:00", "M-W 08:00-22:00, Th-F 08:00-22:00")) df lt;- as.data.frame(str_match(Times$opening_hours,"(?i)Su-S (\d\d:\d\d)-(\d\d:\d\d)")) Times$Monday lt;- paste(df$V2, df$V3,sep = "-") Times$Tuesday lt;- paste(df$V2, df$V3,sep = "-") Times$Wednesday lt;- paste(df$V2, df$V3,sep = "-") Times$Thursday lt;- paste(df$V2, df$V3,sep = "-") Times$Friday lt;- paste(df$V2, df$V3,sep = "-") Times$Satuarday lt;- paste(df$V2, df$V3,sep = "-") Times$Sunday lt;- paste(df$V2, df$V3,sep = "-") df lt;- as.data.frame(str_match(Times$opening_hours,"(?i)Su (\d\d:\d\d)-(\d\d:\d\d)")) Times$Sunday lt;- paste(df$V2, df$V3,sep = "-")
Продолжение для каждого формата диапазона, который я могу найти в данных, которые не являются элегантными, но если бы я мог условно проверить, что V2 и V3 являются NA, потому что дата не найдена, и не вставлять значения в него, это сработало бы, но если есть лучший подход, я весь внимание.
Большое спасибо, Лео.
Ответ №1:
Вот что у меня есть до сих пор, и это, по крайней мере частично, помогает вам в этом. Для каждой спецификации есть строка данных, в которой «строка» указывает местоположение исходного источника.
library(tidyverse) Times %gt;% mutate(row = row_number()) %gt;% separate_rows(opening_hours, sep = ",") %gt;% mutate(opening_hours = str_trim(opening_hours)) %gt;% separate(opening_hours, c("day_range", "hours"), sep = " ") # A tibble: 11 x 3 day_range hours row lt;chrgt; lt;chrgt; lt;intgt; 1 Su 09:00-17:00 1 2 M-S 08:00-20:00 1 3 Su-S 06:00-23:59 2 4 Su-S 08:00-22:00 3 5 Su 08:00-22:00 4 6 M-F 08:30-22:00 4 7 S 08:00-22:00 4 8 Su-S 00:00-23:59 5 9 M-F 08:00-22:00 6 10 M-W 08:00-22:00 7 11 Th-F 08:00-22:00 7
Я думаю, что разбор дневных диапазонов сложен, особенно если вокруг S/Sa/Su и T/Tu/Th могут быть какие-либо несоответствия, которые могут быть очевидны читателю на основе контекста, но их трудно кодировать в логике. Один из подходов может заключаться в том, чтобы взять различные диапазоны дней, которые существуют в ваших данных (может быть, 20 или 30 из них?), и создать таблицу поиска, например, такую, но для всех существующих диапазонов дней, и соединить ее с данными выше, чтобы помочь применить часы строки к нужным дням.
tribble(~day_range, ~Su, ~Mo, ~Tu, ~Wed, ~Th, ~Fr, ~Sa, "Th-F", 0, 0, 0, 0, 1, 1, 0)