У меня есть фрейм данных из двух столбцов «начало» и «конец» в формате ЧЧ: ММ: СС .
Я хотел вычислить продолжительность между началом и концом, используя difftime function
Всегда возвращает эту ошибку: Ошибка в as.POSIXct.numeric (time1): 'origin'должен быть предоставлен
Я прочитал много постов, но ни одно из них не помогло мне.
Загрузка пакетов
library(dplyr)
library(tidyverse)
library(lubridate)
Я удалил часы, чтобы иметь дело только с минутами и секундами
get_time <- function(x){str_sub(x, start = -5) %>% ms()}
df <- df %>% mutate(start = get_time(start)) %>%
mutate(end = get_time(end))
Класс объектов
class(df$start)
gives:
[1] "Period"
attr(,"package")
[1] "lubridate"
start end
26M 22S 26M 23S
26M 25S 26M 37S
29M 47S 30M 13S
Я вычислил продолжительность, используя difftime Функция
df$duration <- with(df, difftime(end, start, units="secs"))
gives error:
Error in as.POSIXct.numeric(time1) : 'origin' must be supplied
Я использовал оператор вычитания, этоработал нормально, за исключением 3-го ряда, когда минуты разные, это дало неправильный ответ.
start end duration
26M 22S 26M 23S 1S
26M 25S 26M 37S 12S
29M 47S 30M 13S 1M -34S
Поправка
Принятый ответ работает отлично, за исключением того, что он возвращает ошибку: Ошибка в mtx1 [3,]: неверное числоразмеры применительно ко вторым двум столбцам «start2» и «end2», которые у меня есть в одном и том же фрейме данных.
образец из моей df
df <- structure(list(item = c("manatee", "manatee", "pile", "pile"), prestart = new("Period", .Data = c(22,
25, 41, 49), year = c(0, 0, 0, 0), month = c(0,
0, 0, 0), day = c(0, 0, 0, 0), hour = c(0, 0, 0,
0), minute = c(26, 26, 26, 26)), preend = new("Period",
.Data = c(23, 37, 48, 50), year = c(0, 0, 0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0
), hour = c(0, 0, 0, 0), minute = c(26, 26, 26, 26)), poststart = new("Period", .Data = c(23, 41, 50,
54), year = c(0, 0, 0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0), hour = c(0, 0, 0, 0),
minute = c(26, 26, 26, 26)), postend = new("Period",
.Data = c(37, 48, 52, 22), year = c(0, 0, 0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0
), hour = c(0, 0, 0, 0), minute = c(26, 26, 26, 27))), row.names = c(NA, -6L), class = c("tbl_df", "tbl",
"data.frame"))
Организация данных только в минутах и секундах (удаление часов)
get_time <- function(x){str_sub(x, start = -5) %>% ms()}
df <- df %>% mutate(prestart = get_time(prestart)) %>%
mutate(preend = get_time(preend)) %>%
mutate(poststart = get_time(poststart)) %>%
mutate(postend = get_time(postend))