R上升/下降缺少时间序列数据R
问题描述:
我有一组时间序列数据(特别是GPS速度数据),其中包括信号丢失时丢失值的间隔。对于缺少短时间段的情况,我将仅使用na.spline进行填充,但这对于较长的时间段不适用。我想根据预定义的加速度限制将上一个真实值的值降至零。R上升/下降缺少时间序列数据R
#create sample data frame
test <- as.data.frame(c(6,5.7,5.4,5.14,4.89,4.64,4.41,4.19,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,5,5.1,5.3,5.4,5.5))
names(test)[1] <- "speed"
#set rate of acceleration for ramp
ramp <- 6
#set sampling rate of receiver
Hz <- 1/10
所以丢失数据的斜坡将使用前值和加速,以获得一个数据点的速度,直到速度达到零(即过去的速度[4.19] +(赫兹*斜坡)),产生以下值:
3.59
2.99
2.39
1.79
1.19
0.59
0
最后,我需要以相反的方式做到这一点,当信号再次恢复时,需要从零斜升。
希望这是明确的。
干杯
答
这不是很优雅,但你可以在循环中做到这一点。
na.pos <- which(is.na(test$speed))
acc = FALSE
for (i in na.pos) {
if (acc) {
speed <- test$speed[i-1]+(Hz*ramp)
}
else {
speed <- test$speed[i-1]-(Hz*ramp)
if (round(speed,1) < 0) {
acc <- TRUE
speed <- test$speed[i-1]+(Hz*ramp)
}
}
test[i,] <- speed
}
结果是:
speed
1 6.00
2 5.70
3 5.40
4 5.14
5 4.89
6 4.64
7 4.41
8 4.19
9 3.59
10 2.99
11 2.39
12 1.79
13 1.19
14 0.59
15 -0.01
16 0.59
17 1.19
18 1.79
19 2.39
20 2.99
21 3.59
22 4.19
23 4.79
24 5.00
25 5.10
26 5.30
27 5.40
28 5.50
注意 '-0.01',因为0.59-(6 * 10)为-0.01,不为0,您可以稍后详谈,我决定不。
答
当问题显示“在每次运行的NAs中将数值从上一个真值降至零”时,我认为这意味着在达到零点后运行中的任何剩余NA也将被替换为零。
现在,使用rleid
从data.table在is.na(test$speed)
创建分组矢量相同的长度test$speed
识别每个运行和使用ave
到这些基团中创建的序列号,seqno
。然后通过组合na.locf(test$speed)
和seqno
来计算下降序列,ramp_down
。最后替换NA。
library(data.table)
library(zoo)
test_speed <- test$speed
seqno <- ave(test_speed, rleid(is.na(test_speed)), FUN = seq_along)
ramp_down <- pmax(na.locf(test_speed) - seqno * ramp * Hz, 0)
result <- ifelse(is.na(test_speed), ramp_down, test_speed)
捐赠:
> result
[1] 6.00 5.70 5.40 5.14 4.89 4.64 4.41 4.19 3.59 2.99 2.39 1.79 1.19 0.59 0.00
[16] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.00 5.10 5.30 5.40 5.50
感谢的是,伟大的工作!是的,我还需要将任何以下新辅助工具更改为零,所以这很好。现在我只需要能够以相反的顺序运行这个部分,这样当信号恢复时,从零到信号拾取时的速度不会有明显的跳跃。有没有办法简单地反向运行? – user8605861
在上面的代码中设置'test_speed