Je dispose d'un jeu de données de température avec un pas de temps semi-horaire (30 min). Je souhaite procéder à une interpolation linéaire afin d'obtenir un pas de temps de 10 min. Cependant, le jeu de données est composé de quelques NA que je souhaite prendre en compte dans l'interpolation. Ainsi, lorsqu'une donnée manque (NA), je souhaite considérer la valeur suivante pour procéder à l'interpolation et augmenter mon pas de temps mais également recalculer par la même occasion la valeur manquante. Exemple:
Code : Tout sélectionner
date heure Temp
6062012 800 15.026
6062012 830 15.481
6062012 900 15.892
6062012 930 16.374
6062012 1000 16.952
6062012 1030 16.884
6062012 1100 NAN
6062012 1130 17.947
6062012 1200 18.056
6062012 1230 18.177
6062012 1300 19.057
6062012 1330 18.716
6062012 1400 18.872
6062012 1430 17.657
6062012 1500 NAN
6062012 1530 NAN
6062012 1600 NAN
6062012 1630 18.228
6062012 1700 18.335
Ici, 1430 correspond à 14h30. Je souhaite donc procéder à une interpolation linéaire entre les valeurs de température des lignes 6 et 8 pour générer des valeurs à 15h10, 15h20, calculer la valeur manquante à 15h30 (ligne 7), et enfin 15h40 et 15h50.
Je me suis lancé dans un code assez long... qui ne fonctionne pas! et je ne comprends pas pourquoi. Le voici:
Code : Tout sélectionner
tab=read.table("test.txt",header=TRUE)
t=1
tab1=tab[c(1:t),]
for (t in 1:length(tab$Tair)){
if (tab$Tair[t]=="NAN"){
b=tab[c(t-1,t+1),]
v=tab$heure[t-1]
time=c(v,v+60)
b=cbind(b,time)
b[,3]=as.numeric(b[,3])
b[,4]=as.numeric(b[,4])
reg=lm(b[,3]~b$time)
a=as.vector(reg$coeff[2])
b=as.vector(reg$coeff[1])
for (i in seq(10,20,by=10)){
tabtemp=data.frame(matrix(ncol=3,nrow=1))
colnames(tabtemp)=c("date","heure","Tair")
x=tab$time[2]+i
y=a*x+b
z=tab$date[t]
u=tab$heure[t]+i
tabtemp[1,]=c(z,u,y)
tab1=rbind(tab1,tabtemp)
}
}else{
if (tab$Tair[t+1]=="NAN"){
b=tab[c(t,t+2),]
v=tab$heure[t]
time=c(v,v+60)
b=cbind(b,time)
b[,3]=as.numeric(b[,3])
b[,4]=as.numeric(b[,4])
reg=lm(b[,3]~b$time)
a=as.vector(reg$coeff[2])
b=as.vector(reg$coeff[1])
for (i in seq(10,20,by=10)){
tabtemp=data.frame(matrix(ncol=3,nrow=1))
colnames(tabtemp)=c("date","heure","Tair")
x=tab$heure[t]+i
y=a*x+b
z=tab$date[t]
tabtemp[1,]=c(z,x,y)
tab1=rbind(tab1,tabtemp)
}
tabtemp=data.frame(matrix(ncol=3,nrow=1))
colnames(tabtemp)=c("date","heure","Tair")
x=tab$heure[t]+30
y=a*x+b
z=tab$date[t]
u=tab$heure[t+1]
tabtemp[1,]=c(z,u,y)
tab1=rbind(tab1,tabtemp)
}else{
b=tab[c(t,t+1),]
v=tab$heure[t]
time=c(v,v+30)
b=cbind(b,time)
b[,3]=as.numeric(b[,3])
b[,4]=as.numeric(b[,4])
reg=lm(b[,3]~b$time)
a=as.vector(reg$coeff[2])
b=as.vector(reg$coeff[1])
for (i in seq(10,20,by=10)){
tabtemp=data.frame(matrix(ncol=3,nrow=1))
colnames(tabtemp)=c("date","heure","Tair")
x=tab$heure[t]+i
y=a*x+b
z=tab$date[t]
tabtemp[1,]=c(z,x,y)
tab1=rbind(tab1,tabtemp)
}
tabtemp2=data.frame(matrix(ncol=3,nrow=1))
colnames(tabtemp2)=c("date","heure","Tair")
tabtemp2[1,]=tab[t+1,]
tab1=rbind(tab1,tabtemp2)
}
}
}
}
tab1
Ce code ne prend pour l'instant pas en compte le fait que l'on puisse rencontrer plusieurs NA consécutifs. Je ne voulais pas faire trop compliqué pour commencer..
J'aurais voulu mettre un exemple des données en pièce jointe mais je ne vois pas comment faire :s
Merci beaucoup pour votre aide!