R语言 如何计算时钟时间点与平均循环平均值之间的差值?

s4n0splo  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(113)

根据这个问题:How can I calculate average hour of an event?如果我们想计算平均圆形均值和中位数,如何计算每个时间点与均值之间的差异?从平均值中减去每个数据点是否足够?下面的代码不起作用。我们的目标是沿着以下路线实现一些东西-如果有两个数据点22和1,圆形平均值是23,那么第一个点是早一个小时,第二个是两个小时,所以-1和+2。但我不知道这是否是计算时差的最佳方法,考虑到时钟时间的循环特性。

library(circular)

hours <- c(1, 20.10, 21, 22, 23 , 0, 1, 2.5)

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)

for (i in hours.circ){
  
  x = as.numeric(hours.circ - mean.circ)%% 24
  print(x)
}
xqnpmsa8

xqnpmsa81#

要实现你想做的事情,你可以使用tidyverse的reframe功能。

hours <- c(1, 20.10, 21, 22, 23 , 0, 1, 2.5)

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

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

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

library(tidyverse)
library(lubridate)

hours_df <- data.frame(hours_start = hours) %>%
  mutate(hours_start = case_when(hours_start<12 ~ lubridate::ymd_hms("2023-06-26 00:00:00") + hours_start*60*60,
                                 hours_start>12 ~ lubridate::ymd_hms("2023-06-25 00:00:00") + hours_start*60*60)) %>%
  reframe(hours_start = hours_start,
          hours_mean = mean(hours_start),
          hours_diff = hours_start - mean(hours_start))

hours_df
#>           hours_start          hours_mean  hours_diff
#> 1 2023-06-26 01:00:00 2023-06-25 23:19:30  100.5 mins
#> 2 2023-06-25 20:06:00 2023-06-25 23:19:30 -193.5 mins
#> 3 2023-06-25 21:00:00 2023-06-25 23:19:30 -139.5 mins
#> 4 2023-06-25 22:00:00 2023-06-25 23:19:30  -79.5 mins
#> 5 2023-06-25 23:00:00 2023-06-25 23:19:30  -19.5 mins
#> 6 2023-06-26 00:00:00 2023-06-25 23:19:30   40.5 mins
#> 7 2023-06-26 01:00:00 2023-06-25 23:19:30  100.5 mins
#> 8 2023-06-26 02:30:00 2023-06-25 23:19:30  190.5 mins

相关问题