我有一些来自不同日期的数据,想知道事件发生的平均(中值或均值)小时。问题是正常平均值在这里不起作用,因为时间是循环的(例如 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.circular
和 median.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)
[图后续]
注意
您也可能会发现尝试使用更不对称的输入进行上述操作很有用。
hours <- c(20, 21, 22, 23 , 12)
关于r - 如何计算事件的平均小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555893/