查找事件在 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 中所有事件的平均值 time,但是当我调用 mean(times)
之类的东西时,输出是一个日期 [=34] =]和一个时间,而我只想要一个时间,与每个事件发生的日期无关。
例如,我尝试总结数据框,如下所示:
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))))
这给了我一个“时间”(就像一个角色对象,这对我来说没问题;这只是在 table 中显示),但是每个小时、分钟和秒都有小数余数。这个问题促使我尝试下一次迭代:
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"
的时间)。
关于如何在事件发生当天找到这个平均时间的任何帮助——通过指向可以执行此任务的函数的方向,或者通过调查个体的平均时间-components 选项——将不胜感激!
一个选项是转换为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
或者另一种选择是将'date'部分改为标准化的单一日期,然后将mean
、format
改为return,只取'time'部分
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
我有一个与多天发生的事件相对应的日期时间列表,我希望找到不同类别事件发生的平均时间,与日期无关(即事件下降的平均时间进入类别 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 中所有事件的平均值 time,但是当我调用 mean(times)
之类的东西时,输出是一个日期 [=34] =]和一个时间,而我只想要一个时间,与每个事件发生的日期无关。
例如,我尝试总结数据框,如下所示:
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))))
这给了我一个“时间”(就像一个角色对象,这对我来说没问题;这只是在 table 中显示),但是每个小时、分钟和秒都有小数余数。这个问题促使我尝试下一次迭代:
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"
的时间)。
关于如何在事件发生当天找到这个平均时间的任何帮助——通过指向可以执行此任务的函数的方向,或者通过调查个体的平均时间-components 选项——将不胜感激!
一个选项是转换为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
或者另一种选择是将'date'部分改为标准化的单一日期,然后将mean
、format
改为return,只取'time'部分
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