簡體   English   中英

查找事件在 R 中發生的平均時間(獨立於日期)

[英]Finding the mean time (independent of date) that an event occurs in R

我有一個與多天發生的事件相對應的日期時間列表,我希望找到不同類別事件發生的平均時間,與日期無關(即,屬於 A 類的事件的平均時間為 11 :04:42)。 我有一個類似於以下內容的數據框:

df <- data.frame(category = c("A", "A", "B", "A", "C", "C", "B", "D", "A", "D", "D", "C"),
                    times = ymd_hms(c("2021-09-12 21:34:22", "2021-09-13 15:42:37",
                            "2021-09-16 22:36:50", "2021-09-24 09:41:00",
                            "2021-09-20 12:14:30", "2021-09-15 16:40:39",
                            "2021-09-15 09:16:39", "2021-09-14 15:50:47",
                            "2021-09-24 18:10:00", "2021-09-21 17:30:00",
                            "2021-09-14 17:43:53", "2021-09-23 19:00:00")))

我想找到 A 類中所有事件的平均時間,但是當我調用mean(times)之類的東西時, output 是一個日期時間,而我只想要一個時間,與每個事件發生的日期無關.

例如,我嘗試總結數據框,如下所示:

summary_times <- df %>%
  group_by(category) %>%
  summarize(avg_time = mean(times))

結果是"2021-09-18 06:20:06 UTC" ,這不是我想要的——我有興趣概括到任何給定的一天,所以我希望有一個不占用日期的時間考慮到個別事件。

我也嘗試過采用小時、分鍾和秒的單獨方法,然后分別采用這些方法,但我也沒有成功。 我的第一次嘗試是這樣的:

summary_times <- df %>% 
  group_by(category) %>%
  summarize(avg_time = paste(mean(hour(times)), ":",
                             mean(minute(times)), ":",
                             mean(second(times))))

這給了我一個“時間”(就像一個字符 object,這對我來說沒問題;這只是在表格中顯示),但每個小時、分鍾和秒都有小數余數。 這個問題讓我嘗試下一次迭代:

summary_times <- df %>% 
  group_by(category) %>%
  summarize(avg_time = paste(sum(hour(times)) %/% n(), ":",
                             sum(minute(times)) %/% n() + (sum(hour(median_datetime)) %% n())*60, ":",
                             sum(second(times)) %/% n() + (sum(minute(median_datetime)) %% n())*60))

我不再在時間的每個組成部分上得到小數余數; 然而,一些組件比它們可能的要大(例如,時間為"15:247:130" )。

任何關於如何在事件發生當天找到這個平均時間的幫助——通過指向可以執行此任務的 function 的方向,或者通過調查獲取單個組件的平均值選項——都會不勝感激!

一個選項是轉換為ITime然后得到mean

library(data.table)
library(dplyr)
df %>%
    group_by(category) %>%
    summarise(avg_time = mean(as.ITime(times)))

-輸出

# A tibble: 4 × 2
  category avg_time
  <chr>    <ITime> 
1 A        16:16:59
2 B        15:56:44
3 C        15:58:23
4 D        17:01:33

或者另一種選擇是將“日期”部分更改為標准化的單個日期,然后采用mean format僅返回“時間”部分

df %>% 
   group_by(category) %>% 
   summarise(times = format(mean(as.POSIXct(format(times, 
          '2021-09-01 %H:%M:%S'))), '%H:%M:%S'))
# A tibble: 4 × 2
  category times   
  <chr>    <chr>   
1 A        16:16:59
2 B        15:56:44
3 C        15:58:23
4 D        17:01:33

或者在base R中執行此操作

transform(aggregate(times ~ category, 
     data = transform(df, 
          times= as.POSIXct(format(times, '2021-09-01 %H:%M:%S'))), mean),
     times = format(times, '%H:%M:%S'))

-輸出

 category    times
1        A 16:16:59
2        B 15:56:44
3        C 15:58:23
4        D 17:01:33

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM