Быстро выявляйте разрывы во временных метках

#r #dplyr

Вопрос:

У меня есть большой кадр данных с десятками тысяч timestamp s в разных file s, как в этом примере (воспроизводимый набор ниже):

 df
    line speaker                                      utterance                   timestamp file
493 0247  ID03.A                     ↑he's moving to↑ Bru: ges= 00:04:57.517 - 00:04:58.832  F03
495 0248    <NA>                                        (0.148) 00:04:58.832 - 00:04:58.980  F03
497 0249  ID03.B                                       =↑a[:h.] 00:04:58.980 - 00:04:59.860  F03
499 0250  ID03.A                    [have you been] to Bruges?= 00:04:59.322 - 00:05:00.529  F03
501 0251    <NA>                                        (0.023) 00:05:00.529 - 00:05:00.552  F03
503 0252  ID03.B           =that's cute [no (but I know of it)] 00:05:00.552 - 00:05:02.420  F03
505 0253  ID03.A                 [it's so cu:te] so cute #yeah# 00:05:01.350 - 00:05:03.260  F03
507 0254    <NA>                                        (0.320) 00:01:03.260 - 00:05:03.580  F03 
509 0255  ID03.A but u::m tt anyway yeah I was writing him a:nd 00:05:03.580 - 00:05:07.430  F03
 

Иногда бывают неправильные timestamp значения, например , в line 0254 , где время начала, тогда 00:01:03.260 как последнее событие в строке выше закончилось 00:05:03.260 . Я могу фильтровать строки с неправильными значениями, однако то, как я это делаю, кажется долгим:

 df %>%
  group_by(file) %>%
  mutate(
    starttime = str_extract(timestamp, "^.*(?=\s-)"),
    endtime = str_extract(timestamp, "(?<=- ).*$"),
    starttime_ms = sapply(strsplit(starttime, ":"), function(x) 1000 * sum(c(3600,60,1) * as.numeric(x))),
    endtime_ms = sapply(strsplit(endtime, ":"), function(x) 1000 * sum(c(3600,60,1) * as.numeric(x))),
    duration = endtime_ms - starttime_ms) %>%
  filter(starttime_ms < lag(starttime_ms) | endtime_ms < starttime_ms)
# A tibble: 1 x 10
# Groups:   file [1]
  line  speaker utterance timestamp                   file  starttime    endtime      starttime_ms endtime_ms duration
  <chr> <chr>   <chr>     <chr>                       <chr> <chr>        <chr>               <dbl>      <dbl>    <dbl>
1 0254  NA      (0.320)   00:01:03.260 - 00:05:03.580 F03   00:01:03.260 00:05:03.580        63260     303580   240320
 

Как я могу быстрее проверить и идентифицировать ошибочные timestamp значения?

Данные:

 df <- structure(list(line = c("0247", "0248", "0249", "0250", "0251", 
                              "0252", "0253", "0254", "0255"), 
                     speaker = c("ID03.A", NA, "ID03.B", "ID03.A", NA, "ID03.B", "ID03.A", NA, "ID03.A"), 
                     utterance = c("↑he's moving to↑ Bru: ges=","(0.148)",
                                   "=↑a[:h.]", 
                                   "[have you been] to Bruges?=", 
                                   "(0.023)",
                                   "=that's cute [no (but I know of it)]", 
                                   "[it's so cu:te] so cute #yeah#",
                                   "(0.320)", 
                                   "but u::m tt anyway yeah I was writing him a:nd"), 
                     timestamp = c("00:04:57.517 - 00:04:58.832", "00:04:58.832 - 00:04:58.980", 
                                   "00:04:58.980 - 00:04:59.860", "00:04:59.322 - 00:05:00.529", 
                                   "00:05:00.529 - 00:05:00.552", "00:05:00.552 - 00:05:02.420", 
                                   "00:05:01.350 - 00:05:03.260", "00:01:03.260 - 00:05:03.580", 
                                   "00:05:03.580 - 00:05:07.430"), 
                     file = c("F03", "F03", "F03", "F03", "F03", "F03", "F03", "F03", "F03")), 
                row.names = c(493L, 495L, 497L, 499L, 501L, 503L, 505L, 507L, 509L), class = "data.frame")
 

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

1. Может быть, использовать diff ?

2. Похоже, что большая часть вашего кода просто преобразует текст метки времени в метку времени, по которой вы действительно можете фильтровать. Я бы посоветовал вам использовать purrr для сортировки всех ваших файлов, а затем применить эти шаги обработки к этому объединенному файлу, чтобы у вас был удобный формат для анализа. (т. е. ваш последний шаг фильтрации)