2017-09-13 19 views
0

私は時系列データ(GPS速度データ、具体的には)があり、信号が失われた場所に欠損値の隙間が含まれています。短期間が欠落している場合は、単にna.splineを使用するだけですが、これは長い期間は不適切です。あらかじめ定義された加速限界に基づいて、最後の真の値からゼロまでの値をランプアップしたいと思います。速度がゼロ(すなわち、最後の速度[4.19] +(ヘルツ*ランプ))に達するまでRamp up/down missing 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 

そこで欠落データ用ランプを得、次のデータ点を取得する前の値と加速度の速度を使用します次の値:

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-(* 10 6)が-0.01であるので、0でないあなたが後でそれを丸めることができ、私がいないことに決めました。

0

NAsの各実行で「最後の真の値から値を0に下げる」という質問があるとき、それは、ゼロに達した後の実行中の残りのNAsもゼロで置き換えられることを意味すると仮定します。

次に、is.na(test$speed)各ランを識別test$speedとしてグループ化ベクトルを同じ長さを作成し、このような基、seqno内のシーケンス番号を作成するaveを使用するdata.tableからrleidを使用します。次いで、の減少する配列を、na.locf(test$speed)seqnoとを組み合わせて計算する。最後に、NAsを交換します。

与える
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

おかげで、素晴らしい仕事!はい、私は次のNAsもゼロに変更する必要があったので、それは問題ありませんでした。今度は、このセクションを逆の順序で実行できるようにする必要があります。その結果、信号が戻ってきたときに、ゼロから信号がピックアップしたときの速度まで急激にジャンプすることはありません。単純にこれを逆に実行する方法はありますか? – user8605861

+0

上記のコードで 'test_speed < - rev(test $ speed)'( 'test_speed < - test $ speed'の代わりに)を設定し、結果は' rev(result) 'です。 –