Пользовательские методы передискретизации в R - PullRequest
0 голосов
/ 05 июня 2018

Уважаемые пользователи, я изучал способы повторной выборки данных временных рядов.В основном моя проблема заключается в том, что я должен сделать расчет с разными сигналами, которые имеют разные временные метки.Сначала я подумал об использовании aproxfun () или пакета zoo.

Проблема заключается в том, что мне нужно поддерживать значения NAN t-1 и t + 1 в случае их наличия и только в том случае, если определенные условия выполнены.Чтобы извлечь различные временные метки сигналов, я сделал следующее:

GlobalTime<-sort(do.call(`c`, data[c(1, 3, 5)])) #extract the total timestamp of the measurements
Time1<-seq.POSIXt(from=min(data$X1, na.rm=TRUE), to=max(data$X1, na.rm=TRUE), by="s") #extract the timestamp of each measurment
Time2<-seq.POSIXt(from=min(data$X3, na.rm=TRUE), to=max(data$X3, na.rm=TRUE), by="s")
Time3<-seq.POSIXt(from=min(data$X5, na.rm=TRUE), to=max(data$X5, na.rm=TRUE), by="s")
#All vectors have different size

Для интерполяции мне нужно рассмотреть 3 пункта.Первый из Времени 1 и 2 дополнительно из Глобального Времени (будучи двумя наиболее близкими к Времени 1 [i]).Я думал, что это можно сделать как:

upperlimits1=c()
lowerlimits1=c()
for (i in 1:length(actualTime)) {
    upperlimits1[i]=min(Mod(actualTime[i+1]-requestTime1[i]))
    lowerlimits1[i]=min(Mod(actualTime[i-1]-requestTime1[i]))     
}

Позже, чтобы сделать интерполяцию, сделать что-то вроде этого:

for (i in 1:length(actualTime)) {

if(lowerlimits1[i]==Time1[i])
resample[i,1]<-value[Time[i-1]]
resample[i,2]<-Time1[i-1]
resample[i,3]<-"OK"
i++    
} else if(upperlimits1[i]==Time1[i]){
resample[i,1]<-value[Time[i+1]]
resample[i,2]<-Time1[i+1]
resample[i,3]<-"OK"
i++    
} else if (upperlimits1[i]!=Time1[i] & lowerlimits1[i]!=Time1[i] & aux[i-1]=="Wrong"){
resample[i,1]<-value[Time1[i-1]]
resample[i,2]<-Time1[i-1]
resample[i,3]<-"Wrong"
i++
} else if (upperlimits1[i]!=Time1[i] & lowerlimits1[i]!=Time1[i] & aux[i+1]=="Wrong"){
resample[i,1]<-value[Time1[i+1]]
resample[i,2]<-Time1[i+1]
resample[i,3]<-"Wrong"
i++
} else if (aux[i]=="C"){
resample<-value[Time1[i-1]]
resample[i,2]<-Time1[i-1]
resample[i,3]<-aux[i-1]
i++
} else {
Delta=upperlimits1[i]-lowerlimits1[i]
if (Delta>3600){
resample[i,3]<-"Wrong"
} if (Delta<3600){
resample[i,3]<-"OK"
coeff=(Time1[i]-lowerlimits1[i]) / (upperlimits1[i]-lowerlimits1[i]);
resample[i,1]=value[lowerlimits1[i]] + (value[upperlimits1[i] - value[lowerlimits1[i]]) * coeff);
i++
}

Редактировать: по запросу я добавляю, как мои данныевыглядит так:

Time1    Value1   Quality1   Time2      Value2    Quality2...
00:00.9  41.3       Ok       00:04.0    78.2         Ok                               
00:01.9  41.68      Ok       00:07.0    78.5         Ok                                
00:04.9  35.34      Ok       00:08.0    66           Ok                                 
00:15.9  35.98      Ok       00:14.0    65.8         Ok                                 
00:21.9  Wrong      Wrong    00:15.0    64.5         Ok                                   
00:22.9  38.9       Ok       00:19.0    40.5         Ok                                  
59:56.5  40.1       Ok       00:21.0    30.5         Ok
#of course sometimes wrong values can be recorded for longer periods as hours or days
#at the end the interpolation has the purpose of having the three or more signals with same timestamp

Требуемый вывод

Time1         Value1       Quality1   Time2      Value2    Quality2...
    01:00:00  IntValue       Ok       01:00:00   IntValue      Ok                               
    02:00:00  IntValue       Ok       02:00:00   IntValue      Ok                                
    03:00:00  IntValue       Ok       03:00:00   IntValue      Ok                                 
    04:00:00  IntValue       Ok       04:00:00   IntValue      Ok                                 
    05:00:00  IntValue       Ok       05:00:00   IntValue      Ok                                   
    06:00:00  IntValue       Ok       06:00:00   IntValue      Ok                                  
    07:00:00  IntValue       Ok       07:00:00   IntValue      Ok

Но если столбец качества был неправильным в течение более 24 часов, интерполяция должна написать

Как вы можетепредставьте код не работает.Кто-нибудь пробовал это раньше?

BR

...