我有一组时间序列数据(具体是GPS速度数据),其中包括信号丢失时缺失值的间隙。对于短期持续时间的错误,我将简单地使用na.spline填充,但是这对于更长的时间段来说是不合适的。我想根据预定义的加速度限制将最后一个真值减去零值。
#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] +(Hz *斜坡)),产生以下值:
3.59
2.99
2.39
1.79
1.19
0.59
0
最后,我需要以相反的方式执行此操作,以便在信号再次恢复时从零上升。
希望这很清楚。
干杯
答案 0 :(得分: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.你可以稍后再舍,我决定不这样做。
答案 1 :(得分:0)
当问题在每次运行的NA中“将值从最后一个真值减小到零”时,我认为这意味着在达到零之后运行中的任何剩余NA也将被替换为零。
现在,使用data.table中的LOG.debug(getMethodName())
创建一个与rleid
长度相同的分组向量,用于标识test$speed
中的每次投放,并使用is.na(test$speed)
创建序列号这些团体ave
。然后通过合并seqno
和ramp_down
计算下降序列na.locf(test$speed)
。最后更换NAs。
seqno
,并提供:
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)