[R] linear interpolation of multiple random time series
Mike Lawrence
Mike.Lawrence at DAL.CA
Thu Jul 19 20:14:45 CEST 2007
Hi all,
Looking for tips on how I might more optimally solve this. I have
time series data (samples from a force sensor) that are not
guaranteed to be sampled at the same time values across trials. ex.
trial time x
1 1 1
1 5 4
1 7 9
1 12 20
2 1 0
2 3 5
2 9 10
2 13 14
2 19 22
2 24 32
Within each trial I'd like to use linear interpolation between each
successive time sample to fill in intermediary timepoints and x-
values, ex.
trial time x
1 1 1
1 2 1.75
1 3 2.5
1 4 3.25
1 5 4
1 6 6.5
1 7 9
1 8 11.2
1 9 13.4
1 10 15.6
1 11 17.8
1 12 20
2 1 0
2 2 2.5
2 3 5
2 4 5.83333333333333
2 5 6.66666666666667
2 6 7.5
2 7 8.33333333333333
2 8 9.16666666666667
2 9 10
2 10 11
2 11 12
2 12 13
2 13 14
2 14 15.3333333333333
2 15 16.6666666666667
2 16 18
2 17 19.3333333333333
2 18 20.6666666666667
2 19 22
2 20 24
2 21 26
2 22 28
2 23 30
2 24 32
The solution I've coded (below) involves going through the original
data frame line by line and is thus very slow (indeed, I had to
resort to writing to file as with a large data set I started running
into memory issues if I tried to create the new data frame in
memory). Any suggestions on a faster way to achieve what I'm trying
to do?
#assumes the first data frame above is stored as 'a'
arows = (length(a$x)-1)
write('', 'temp.txt')
for(i in 1:arows){
if(a$time[i+1] > a$time[i]){
write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append
= T)
x1 = a$time[i]
x2 = a$time[i+1]
dx = x2-x1
if(dx != 1){
y1 = a$x[i]
y2 = a$x[i+1]
dy = y2-y1
slope = dy/dx
int = -slope*x1+y1
temp=a[i,]
for(j in (x1+1):(x2-1)){
temp$time = j
temp$x = slope*j+int
write.table(temp, 'temp.txt', row.names = F, col.names = F,
append = T)
}
}
}else{
write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append
= T)
}
}
i=i+1
write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append = T)
b=read.table('temp.txt',skip=1)
names(b)=names(a)
More information about the R-help
mailing list