У меня нерегулярная последовательность минут с миллисекундами.
msc <- c("58:49.5", "59:05.3","59:37.0", "59:50", "00:00.4", "01:41.5","03:49.5")
переход с "59:50"
на "00:00.4"
означает, что начался новый час.
вектор со временем может быть не обязательно именно этот и не всегда есть переход в новый час, я просто показал худший вариант.
Вопрос в том
Как я могу создать вектор, который будет подсчитывать количество минут и миллисекунд, прошедших от первой даты до последней.
первые данные 58:49.5
= 00:00.0
последние данные 03:49.5
вектор результата
"00:00.0" "00:00.1" "00:00.2" ........... "05:00:00"
Сначала добавьте часы к данным
library(lubridate)
hmsc <- hours(cumsum(c(0, diff(as.numeric(ms(msc)))) < 0)) + ms(msc)
затем примените seq
для каждого набора времен, преобразуйте в период, а затем в дату и время.
Наконец paste
минуты и миллисекунды. Это необходимо сделать в два этапа, иначе миллисекунды будут иметь ошибки округления.
dat <- unique(unlist(
apply(cbind(seq_along(hmsc)[-length(hmsc)],
seq_along(hmsc)[-1]), 1, \(x){
Date <- as_datetime(seconds_to_period(
seq(as.numeric(hmsc[x[1]]), as.numeric(hmsc[x[2]]), 0.1)))
})))
res <- dat - dat[1]
paste0(format.Date(res, "%M:%S"),
sub(".*(\\..*)", "\\1", sprintf("%0.1f", res)))
выход
[1] "00:00.0" "00:00.1" "00:00.2" "00:00.3" "00:00.4" "00:00.5" "00:00.6"
...
[2990] "04:58.9" "04:59.0" "04:59.1" "04:59.2" "04:59.3" "04:59.4" "04:59.5"
[2997] "04:59.6" "04:59.7" "04:59.8" "04:59.9" "05:00.0"
Привет, я не достаточно ясно выразился в своем вопросе, и вы, кажется, неправильно поняли, что я имел в виду. Я отредактировал свой вопрос, чтобы сделать его более понятным, пожалуйста, просмотрите его.
Вы можете просто вычесть первый элемент из полученного вектора. добавлю правку...
Я думаю, вы не учли проблему с переходом на новый час. Вот результат вашего скрипта. Вот результат вашего скрипта. [697] "59:59.1" "59:59.2" "59:59.3" "59:59.4" "59:59.5" "59:59.6" "59:59.7" "59:59.8" [705] "59:59.9" "00:00.0" "00:00.1" "00:00.2" "00:00.3" "00:00.4" "00:00.5" "00:00.6"
...и если вычесть первый элемент, то получится [1] "00:00.0" "00:00.1" "00:00.2" "00:00.2" "00:00.3" "00:00.5" "00:00.6"
. Сколько элементов должен иметь результирующий вектор?
Пожалуйста, обновите свой код с помощью вычитания
Входные данные немного неудобны, но вот моя попытка.
library(tidyverse)
msc <- c("58:49.5", "59:05.3","59:37.0", "59:50", "00:00.4", "01:41.5","03:49.5")
msc2 <- lubridate::ms(msc)
df <- tibble(msc, msc2)
df <- df %>%
mutate(change = msc2 < lag(msc2)) %>%
mutate(change = if_else(row_number() == 1, FALSE, change))
df <- df %>%
mutate(n_changes = cumsum(change))
df <- df %>%
mutate(msc3 = msc2 + hours(n_changes))
final <- df %>%
mutate(dummy_time = origin + msc3 - first(msc3)) %>%
mutate(total_sec = interval(first(dummy_time), dummy_time) / dseconds(1),
minutes = (total_sec) %/% 60,
seconds = (total_sec) - (minutes * 60)) %>%
mutate(diff = paste(str_pad(minutes, 2, pad = "0", side = "left"),
str_pad(round(seconds, 1), 2, pad = "0", side = "left"),
sep = ":")) %>%
select(msc, diff)
final
#> # A tibble: 7 × 2
#> msc diff
#> <chr> <chr>
#> 1 58:49.5 00:00
#> 2 59:05.3 00:15.8
#> 3 59:37.0 00:47.5
#> 4 59:50 01:0.5
#> 5 00:00.4 01:10.9
#> 6 01:41.5 02:52
#> 7 03:49.5 05:00
Created on 2024-08-08 with reprex v2.0.2
Привет, у вас должна быть серия с шагом в одну миллисекунду, как в моем примере. "00:00.0" "00:00.1" "00:00.2"
Я неправильно понял, поскольку думал, что вам нужен отсчет минут и секунд, используя нерегулярный ряд.
Сколько элементов должен иметь результирующий вектор?