我有一個字符向量,其中包含按時間順序排列的日期和時間,格式如下:YYYY-MM-DD HH:MM:SS(用 R 術語表示:%Y-%m-%d %H:%M:%S) . 我還創建了一個函式,它為我提供了兩個 POSIX 物件之間特定格式的時間差 (get_formatted_time_difference),以及一個將字串轉換為 POSIX 物件的函式 (string_to_POSIX)。
我想做的是一個將我的字符向量(長度:n)作為引數并回傳時間差向量(長度:n-1)的函式。結果向量的第一個元素應該是初始向量的第一個和第二個元素之間的時間差。結果向量的第二個元素應該是初始向量的第二個和第三個元素之間的時間差,依此類推。
為了清楚起見,我想要的是:
| 初始向量 | 結果向量 |
|---|---|
| “2022-09-18 17:00:00” | “0 天,05:00:00” |
| “2022-09-18 12:00:00” | “0 天,19:00:00” |
| “2022-09-17 17:00:00” | “0 天,05:00:00” |
| “2022-09-17 12:00:00” | “0 天,17:00:00” |
| “2022-09-16 19:00:00” | - |
我不確定如何解決這個問題。到目前為止,我考慮過創建一個包含兩個向量的矩陣(我們稱它們為 v1 和 v2)并添加 NA 以創建某種滯后,如下所示:
| v1 | v2 |
|---|---|
| 不適用 | “2022-09-18 17:00:00” |
| “2022-09-18 17:00:00” | “2022-09-18 12:00:00” |
| “2022-09-18 12:00:00” | “2022-09-17 17:00:00” |
| “2022-09-17 17:00:00” | “2022-09-17 12:00:00” |
| “2022-09-17 12:00:00” | “2022-09-16 19:00:00” |
| “2022-09-16 19:00:00” | 不適用 |
這個想法是將 apply 系列中的一個函式應用于所有不包含 NA 值的行。在 apply 函式中呼叫的自定義函式必須將值轉換為 POSIX,然后使用“get_formatted_time_difference”并將兩列作為引數。
我不確定如何做到這一點,也不確定這是否是最好的方法。你能告訴我你將如何解決這個問題嗎?此外,如果您的方法與我的不同,我仍然很想知道如何使用其中一個應用函式來解決我最初看到的問題。
一如既往,非常感謝您的幫助!
library(reprex)
library(magrittr)
# Functions ---------------------------------------------------------------
get_formatted_time_difference <- function(time1, time2) {
# Params must be POSIX
total_amount_seconds <- difftime(time1, time2, units = "sec") %>% abs()
amount_of_days <- floor(total_amount_seconds / (60 * 60 * 24))
amount_of_hours <- floor(
(total_amount_seconds
- amount_of_days * (60 * 60 * 24)) / (60 * 60)
)
amount_of_minutes <- floor(
(total_amount_seconds
- amount_of_days * (60 * 60 * 24)
- amount_of_hours * (60 * 60)) / 60
)
amount_of_seconds <- floor(
(total_amount_seconds
- amount_of_days * (60 * 60 * 24)
- amount_of_hours * (60 * 60)
- amount_of_minutes * 60)
)
hours <- amount_of_hours
minutes <- amount_of_minutes
seconds <- amount_of_seconds
if (amount_of_hours < 10) {hours <- paste0("0", amount_of_hours)}
if (amount_of_minutes < 10) {minutes <- paste0("0", amount_of_minutes)}
if (amount_of_seconds < 10) {seconds <- paste0("0", amount_of_seconds)}
return(
paste0(
floor(amount_of_days), " day(s), ",
hours, ":", minutes, ":", seconds
)
)
}
string_to_POSIX <- function(time) {
as.POSIXct(time, format = "%Y-%m-%d %H:%M:%S")
}
# Data --------------------------------------------------------------------
events <- c("2022-09-18 17:00:00",
"2022-09-18 12:00:00",
"2022-09-17 17:00:00",
"2022-09-17 12:00:00",
"2022-09-16 19:00:00")
# -------------------------------------------------------------------------
v1 <- c(NA, events)
v2 <- c(events, NA)
(mat <- matrix(data = c(v1, v2), ncol = 2))
#> [,1] [,2]
#> [1,] NA "2022-09-18 17:00:00"
#> [2,] "2022-09-18 17:00:00" "2022-09-18 12:00:00"
#> [3,] "2022-09-18 12:00:00" "2022-09-17 17:00:00"
#> [4,] "2022-09-17 17:00:00" "2022-09-17 12:00:00"
#> [5,] "2022-09-17 12:00:00" "2022-09-16 19:00:00"
#> [6,] "2022-09-16 19:00:00" NA
使用reprex v2.0.2創建于 2022-09-21
uj5u.com熱心網友回復:
從你的
events <- c("2022-09-18 17:00:00",
"2022-09-18 12:00:00",
"2022-09-17 17:00:00",
"2022-09-17 12:00:00",
"2022-09-16 19:00:00")
簡單地diff(as.POSIXlt(events))做到了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510332.html
標籤:r日期向量申请
