Yogesh Tiwari wrote:
> Hello R Users,
>
> How to make a variable equidistance with time i.e. how to interpolate a
> variable if it is not sampled at equal time interval.
>
Hi Yogesh,
Don't know whether this will suit your purpose. I wrote it to enable
color-coded plotting of highly variable data. If you pass your intervals
as "yvec", it will linearly interpolate values of "xvec" so that the
maximum difference between "yvec"s is "maxjump". If the "yvec"s are not
multiples of "maxjump", you will get some smaller intervals.
linterp<-function(xvec,yvec,interp=NA,maxjump=1) {
if(is.list(xvec) && missing(yvec)) {
yvec<-xvec$y
xvec<-xvec$x
}
if(!missing(xvec) && !missing(yvec)) {
newlength<-oldlength<-length(xvec)
oldrows<-1:oldlength
for(l in 2:oldlength) {
# use the y values as a default
if(is.na(interp[1])) ninserts<-ceiling(abs(yvec[l]-yvec[l-1])/maxjump)
# assume interp is already a function of the successive x/y pairs
else ninserts<-ceiling(abs(interp[l-1])/maxjump)
oldrows[l]<-oldrows[l-1]+ninserts
newlength<-newlength+ninserts-1
}
xy<-list(x=rep(NA,newlength),y=rep(NA,newlength))
xy$x[oldrows]<-xvec
# if xvec and yvec are not the same length, give up
if(oldlength == length(yvec)) {
xy$y[oldrows]<-yvec
for(index in 1:(oldlength-1)) {
ninterp<-oldrows[index+1]-oldrows[index]
if(ninterp > 1) {
xinc<-(xvec[index+1]-xvec[index])/ninterp
yinc<-(yvec[index+1]-yvec[index])/ninterp
for(istep in 1:(ninterp-1)) {
xy$x[oldrows[index]+istep]<-xy$x[oldrows[index]+istep-1]+xinc
xy$y[oldrows[index]+istep]<-xy$y[oldrows[index]+istep-1]+yinc
}
}
}
return(xy)
}
else cat("xvec and yvec must have the same length!\n")
}
cat("Usage: linterp(xvec,yvec,interp=NA,maxjump=1)\n")
}
Jim
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.