1) 不减 假设时间是不减的,并且每个时间与前一个时间相差不超过24小时,我们可以通过在遇到比前一个小时小的小时数时每次加1来确定每个时间所属的
day
。将
day
乘以24并加上
hour
,得到
hours2
,即自hour 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
median(hours2) %% 24
在这种替代方案中,我们将时间映射到圆形上,并使用circular包中的mean.circular和median.circular。有关该包的更多信息可在其帮助文件以及
使用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
median.circ <- median(hours.circ)
as.numeric(median.circ) %% 24
plot(hours.circ)
points(mean.circ, col = "red", cex = 3)
points(median.circ, col = "blue", cex = 2)
[图表后继续阅读]
![屏幕截图](https://istack.dev59.com/o4xfU.webp)
注意
您可能会发现使用更不对称的输入更有用。
hours <- c(20, 21, 22, 23 , 12)
sum(hours)%%24
得到0。 - maydinc(9,10,11,12,13,14,15,16,17,18,20, 21, 22, 23 , 0, 1, 2, 3, 4,5,6,7,8,9)
这样的数据,你期望中位数的值是什么? - maydin