Ошибка «длинная длина объекта не кратна короткой длине объекта» при использовании difftime - PullRequest
0 голосов
/ 23 марта 2020

Я вычисляю разницу в секундах двух последовательных строк с помощью следующего кода

set.seed(79)

library(outbreaks)
library(lubridate)

# Import data
disease_df <- measles_hagelloch_1861[, 3, drop = FALSE]

# Generate a random time for each day
disease_df$time <- sample(1:86400, nrow(disease_df), replace = TRUE)
disease_df$time <- hms::as.hms(disease_df$time)

# Combine date and time
disease_df$time1 <- with(disease_df, ymd(date_of_prodrome) + hms(time))

# Sort data
disease_df <- disease_df[order(disease_df$time1), ]

# Difference in days of two consecutive row
disease_df$diff <- as.numeric(difftime(disease_df$date_of_prodrome,
                                       dplyr::lag(disease_df$date_of_prodrome, 1), units = 'days'))

# Difference in seconds of two consecutive row
disease_df$diff1 <- as.numeric(difftime(disease_df$time1,
                                       dplyr::lag(disease_df$time1, 1), units = 'secs'))

Вот результирующий кадр данных

enter image description here

и сообщение об ошибке longer object length is not a multiple of shorter object length.

Не могли бы вы объяснить, почему difftime отлично работает в течение нескольких дней, но приводит к ошибке в течение нескольких секунд? Большое вам спасибо!

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Видимо dplyr недоволен строкой: dplyr::lag(disease_df$time1, 1) из-за формата disease_df$time1.

Преобразование его в POSIXct работает, поэтому просто обновите эту часть своего кода:

# Combine date and time and convert to POSIXct
disease_df$time1 <- as.POSIXct(with(disease_df, ymd(date_of_prodrome) + hms(time)))
1 голос
/ 23 марта 2020

time1 столбец имеет тип "POSIXlt". Я не совсем уверен, почему difftime с units = 'secs' не работает, но если вы конвертируете его в POSIXct, он работает без каких-либо ошибок.

disease_df$time1 <- as.POSIXct(disease_df$time1)
disease_df$diff1 <- as.numeric(difftime(disease_df$time1,
                               dplyr::lag(disease_df$time1, 1), units = 'secs'))
...