r - 如何计算事件的平均小时数?

标签 r time-series average

我有一些来自不同日期的数据,想知道事件发生的平均(中值或均值)小时。问题是正常平均值在这里不起作用,因为时间是循环的(例如 1 在 24 之后)。例如,晚上 11 点和凌晨 1 点的平均值应该是午夜,但正常的平均函数会给出正午。但是,我找不到任何为此而构建的功能!有没有办法在 R 中做到这一点?

示例数据:

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

预期结果:均值 = 0,中位数 = 0

最佳答案

1) 非递减 假设时间是非递减的,并且每次都小于前一次的 24 小时,我们可以通过添加来确定每次的 day 1 每次我们遇到比前一小时少的一小时。将一天中的 24 次添加到 hour 得到 hours2 这是从第 0 小时开始的总小时数。最后取平均值或中位数模 24 以确保它在区间 [ 0, 24) .

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

day <- cumsum(c(0, diff(hours) < 0))
hours2 <- hours + 24 * day

mean(hours2) %% 24
## [1] 0

median(hours2) %% 24
## [1] 0

2) 循环 在这个替代方案中,我们将时间映射到一个圆并使用循环包中的 mean.circularmedian.circular .有关该软件包的更多信息,请参见其帮助文件以及 Answering biological questions using circular data and analysis in R

library(circular)

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

hours.circ <- circular(hours, template = "clock24", units = "hours")

mean.circ <- mean(hours.circ)
as.numeric(mean.circ) %% 24
## [1] 0

median.circ <- median(hours.circ)
as.numeric(median.circ) %% 24
## [1] 0

plot(hours.circ)
points(mean.circ, col = "red", cex = 3)
points(median.circ, col = "blue", cex = 2)

[图后续]

screenshot

注意

您也可能会发现尝试使用更不对称的输入进行上述操作很有用。

hours <- c(20, 21, 22, 23 , 12)

关于r - 如何计算事件的平均小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555893/

相关文章:

c - 计算未知数量输入的平均值

c - 查找数组的平均值

r - 从 sum() 和 '+' 获得不同的结果

r - 如何在r中不使用cumprod的情况下累积乘以向量?

r - 导入 .xlsx 文件后,从矩阵列表构建适当的数据框

r - 将嵌套列表转换为 R 中的多维数组,保留切片顺序

matlab - 如何为此预测示例 Matlab 进行标记

postgresql - PostgreSQL 中的物化 View 可以继承吗?

r - 使用灵活的调用(在循环中使用)从宽到长的不同宽度的数据透视

assembly - 如何计算汇编中两个 8 位值的 8 位平均值?