2017-09-13 86 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)'。 –