如何计算 R 中圆形域(工作日)的相对差异

How to compute relative difference in a circular domain (weekday) in R

我想找出一周中某一天到另一天的相对距离。假设以下 R 输入从第 0 天开始的相对差异,以天为单位:

day <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

域的周期为一周(因此为 7 天)。我想获得以下值:

relativedist <- c(0, 1, 2, 3, 3, 2, 1, 0, 1, 2, 3, 3, 2, 1, 0)

使用模数是自然而然的第一个猜测,但正如预期的那样,不正确 - 它不适用于圆形域:

day%%4 

结果

[1] 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2

我查看了软件包 circularcircStats,但没有找到适用的功能。

解决此问题的一种方法如下:

day <- c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)
diffFromNearest <- function(x, modulus) {
  dif <- x %% modulus
  ifelse(dif > modulus %/% 2, modulus - dif, dif)
}
diffFromNearest(day, 7)

 [1] 0 1 2 3 3 2 1 0 1 2 3 3 2 1 0

在这种情况下,pmin 函数会给出正确的答案,但您的数据被安排在自然边界处开始和停止,因此您需要确保它符合您的需要(确实如此)使用 1:20 作为输入传递与@NickK 提供的 diffFromNearest 函数相同的序列:

> pmin( day %% 7, rev(day)%%7)
 [1] 0 1 2 3 3 2 1 0 1 2 3 3 2 1 0

pminpmax 函数对两个向量进行“并排比较”。

这使用 pmin 和模数算法实现了@NickK 程序中的逻辑:

pmin( day %% 7, (7-day)%%7)


> replicate( 20, {day = sample(1:30, 20); identical( pmin( day %% 7, (7-day)%%7), 
                                                     diffFromNearest(day, 7) )} )
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[16] TRUE TRUE TRUE TRUE TRUE