得到后续行之间的 angular 度差

Get angular degree difference between consequent rows

我正在努力设计一个 运行 优于 14*10e6 records 并且能够将每个 element_id 分配给 difference (-) 的有效解决方案与其之前的 element_id 相比。显然,对于每个 element_id == 1,delta 始终等于 NA,因为它没有要与之比较的前一个元素。

考虑 data.frame 如下:

set.seed(1234)
ID <- c(rep(1, 6), rep(2, 5))
element_id <- c(seq.int(1, 6), seq.int(1, 5))
degree <- as.integer(runif(11, 0, 360))  #angular degrees goes from 0 to 359 because 0 is also 360.
mydf <- data.frame(ID, element_id, degree) 

这个问题与其他与连续行之间的差异相关的问题的不同之处在于,如果 element_id i 等于 350 并且 element_id i+1 是等于10,差应该就是20.

您可以尝试功能getDifference()。函数 getDifference():

  1. 获取两度之间的差异
  2. 180 添加到该差异
  3. 获取 360 (%% 360) 的模数并减去 180

代码:

# Function to calculate difference in degrees
getDifference <- function(degreeA = 0, degreeB = 0) {
    (degreeA - degreeB + 180) %% 360 - 180
}
# Test function
getDifference(10, 350)
# [1] 20
getDifference(350, 10)
# [1] -20

应用于 OP 数据

# 1. Get difference with previous row (data.table shift)
# 2. For each ID is done using data.table by 
library(data.table)
setDT(mydf)
mydf[, degreeDiff := getDifference(degree, shift(degree)), ID]

#    ID element_id degree degreeDiff
# 1:  1          1     40         NA
# 2:  1          2    224       -176
# 3:  1          3    219         -5
# 4:  1          4    224          5
# 5:  1          5    309         85
# 6:  1          6    230        -79
# 7:  2          1      3         NA
# 8:  2          2     83         80
# 9:  2          3    239        156
#10:  2          4    185        -54
#11:  2          5    249         64