如何计算 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
我查看了软件包 circular
和 circStats
,但没有找到适用的功能。
解决此问题的一种方法如下:
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
pmin
和 pmax
函数对两个向量进行“并排比较”。
这使用 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
我想找出一周中某一天到另一天的相对距离。假设以下 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
我查看了软件包 circular
和 circStats
,但没有找到适用的功能。
解决此问题的一种方法如下:
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
pmin
和 pmax
函数对两个向量进行“并排比较”。
这使用 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