2017-09-13 2 views
0

신호가 손실 된 누락 값의 누락을 포함하는 일련의 시계열 데이터 (특히 GPS 속도 데이터)가 있습니다. 짧은 지속 시간의 누락 된 기간에 대해서는 간단히 na.spline을 사용하여 채울 예정이지만, 더 긴 기간에는 부적합합니다. 미리 정의 된 가속 한계를 기준으로 마지막 실제 값을 0으로 낮추고 싶습니다.Ramp up/down 누락시 시계열 데이터가 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] + (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 
} 

결과는 다음과 같습니다 0.59- (6 * 10) -0.01, 0이 아닌 나중에 반올림 할 수 있기 때문에 '-0.01'는, 내가하지하기로 결정

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

각 NAs 실행에서 "마지막 참값에서 0으로 값을 낮추십시오"라고 말하면 나는 0에 도달 한 후 실행중인 나머지 NAs도 0으로 대체된다는 것을 가정합니다.

이제 is.na(test$speed)에서 그룹화 벡터 각 런을 식별 test$speed 같은 길이를 생성하고, seqno 같은 그룹 내의 시퀀스 번호를 생성하는 ave를 사용 data.table에서 rleid를 사용한다. 그런 다음 na.locf(test$speed)seqno을 결합하여 감소하는 시퀀스 인 ramp_down을 계산합니다. 마지막으로 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

덕분에, 좋은 일! 네, 다음의 NA가 0으로 변경되어야하므로 괜찮 았습니다. 이제이 섹션을 역순으로 실행할 수 있어야합니다. 그러면 신호가 다시 선택되면 신호가 들릴 때 어떤 속도로든 0에서 급격한 점프가 발생하지 않습니다. 단순히 역순으로 실행하는 방법이 있습니까? – user8605861

+0

위의 코드에서'test_speed <- rev (test $ speed)'를 ('test_speed <- test $ speed' 대신에) 설정하고 결과는'rev (result)'입니다. –