得到后续行之间的 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()
:
- 获取两度之间的差异
- 将
180
添加到该差异
- 获取
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
我正在努力设计一个 运行 优于 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()
:
- 获取两度之间的差异
- 将
180
添加到该差异 - 获取
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