2017-09-13 95 views
0

我有一组时间序列数据(特别是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 

最后,我需要以相反的方式做到这一点,当信号再次恢复时,需要从零斜升。

希望这是明确的。

干杯

回答

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,您可以稍后详谈,我决定不。

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 
+0

感谢的是,伟大的工作!是的,我还需要将任何以下新辅助工具更改为零,所以这很好。现在我只需要能够以相反的顺序运行这个部分,这样当信号恢复时,从零到信号拾取时的速度不会有明显的跳跃。有没有办法简单地反向运行? – user8605861

+0

在上面的代码中设置'test_speed < - rev(test $ speed)'(而不是'test_speed < - test $ speed'),然后结果是'rev(result)'。 –