0

I have a large dataframe which has observations from surveys from multiple states for several years. Here's the data structure:

state | survey.year | time1 | obs1 | time2 | obs2
CA    | 2000        | 1     | 23   | 1.2   | 43
CA    | 2001        | 2     | 43   | 1.4   | 52
CA    | 2002        | 5     | 53   | 3.2   | 61
...
CA    | 1998        | 3     | 12   | 2.3   | 20
CA    | 1999        | 4     | 14   | 2.8   | 25
CA    | 2003        | 5     | 19   | 4.3   | 29
...
ND    | 2000        | 2     | 223   | 3.2   | 239
ND    | 2001        | 4     | 233   | 4.2   | 321
ND    | 2003        | 7     | 256   | 7.9   | 387

For each state/survey.year combination, I would like to interpolate obs2 so that it's time-location is lined up with (time1,obs1).

ie I would like to break up the dataframe into state/survey.year chunks, perform my linear interpolation, and then stitch the individual state/survey.year dataframes back together into a master dataframe.

I have been trying to figure out how to use the plyr and Hmisc packages for this. But keeping getting myself in a tangle.

Here's the code that I wrote to do the interpolation:

require(Hmisc)
df <- new.obs2 <- NULL
for (i in 1:(0.5*(ncol(indirect)-1))){
 df[,"new.obs2"] <-   approxExtrap(df[,"time1"],
                                     df[,"obs1"],
                                     xout = df[,"obs2"],
                                     method="linear",
                                     rule=2)
}

But I am not sure how to unleash plyr on this problem. Your generous advice and suggestions would be much appreciated. Essentially - I am just trying to interpolate "obs2", within each state/survey.year combination, so it's time references line up with those of "obs1".

Of course if there's a slick way to do this without invoking plyr functions, then I'd be open to that...

Thank you!

Anupa Fabian
  • 681
  • 1
  • 5
  • 4

1 Answers1

2

This should be as simple as,

ddply(df,.(state,survey.year),transform,
                              new.obs2 = approxExtrap(time1,obs1,xout = obs2,
                                                      method = "linear",
                                                      rule = 2))

But I can't promise you anything, since I haven't the foggiest idea what the point of your for loop is. (It's overwriting df[,"new.obs2"] each time through the loop? You initialize the entire data frame df to NULL? What's indirect?)

joran
  • 169,992
  • 32
  • 429
  • 468