Уважаемые пользователи, я изучал способы повторной выборки данных временных рядов.В основном моя проблема заключается в том, что я должен сделать расчет с разными сигналами, которые имеют разные временные метки.Сначала я подумал об использовании 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