R разбить дневные диапазоны часов на 7 отдельных столбцов с понедельника по воскресенье с указанием часов

#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)