[R] zoo object: replace NAs from another zoo object

Gabor Grothendieck ggrothendieck at gmail.com
Fri Mar 14 12:30:22 CET 2008


Try this:

> window(old, time(new)) <- ifelse(is.na(new), old[time(new)], new)
> old
                         P    PAR pcp
(05/19/06 23:58:00)     NA     NA  NA
(05/20/06 00:00:00) 956.23 252.30  NA
(05/20/06 00:02:00) 955.68 244.85   0
(05/20/06 00:04:00) 955.70 236.45   0
(05/20/06 00:06:00) 955.68 309.16   0
(05/20/06 00:08:00) 955.69 301.72   0


On Fri, Mar 14, 2008 at 6:16 AM, Timothy W. Hilton <hilton at meteo.psu.edu> wrote:
> Gabor,
>
> Many thanks for your suggestion.  This solution is very close, but not exactly what I had in mind, because na.omit removes the entire row in which an NA appears.  I want to replace values in old with non-NA values from corresponding times in new.  If a timestamp from old does not appear in new, or appears but the new value is NA, then I want to keep the old value.  That is, I want to write mergeOldNew(old, new) to get the following result:
>
> > new
>                         P    PAR pcp
> (05/20/06 00:00:00) 956.23 252.30  NA
> (05/20/06 00:02:00)     NA 244.85  NA
> (05/20/06 00:04:00)     NA 236.45  NA
>
> > old
>                         P    PAR pcp
> (05/19/06 23:58:00)     NA     NA  NA
> (05/20/06 00:00:00)     NA     NA  NA
> (05/20/06 00:02:00) 955.68 311.54   0
> (05/20/06 00:04:00) 955.70 320.74   0
> (05/20/06 00:06:00) 955.68 309.16   0
> (05/20/06 00:08:00) 955.69 301.72   0
>
> > mergeOldNew(old, new)
>
> (05/19/06 23:58:00)     NA     NA  NA
> (05/20/06 00:00:00) 956.23 252.30  NA
> (05/20/06 00:02:00) 955.68 244.85   0
> (05/20/06 00:04:00) 955.70 236.45   0
> (05/20/06 00:06:00) 955.68 309.16   0
> (05/20/06 00:08:00) 955.69 301.72   0
>
> Looping your suggestion over the individual columns in old and new works, but I wonder if there is a more elegant solution to avoid the loop?
>
> Many thanks for your help.  dput output for old and new are below.
>
> -Tim
>
> ========
>
> > dput(old)
> structure(c(NA, NA, 955.68, 955.7, 955.68, 955.69, NA, NA, 311.54,
> 320.74, 309.16, 301.72, NA, NA, 0, 0, 0, 0), .Dim = c(6L, 3L), .Dimnames = list(
>    c("13679", "13680", "13681", "13682", "13683", "13684"),
>    c("P", "PAR", "pcp")), index = structure(c(13287.9986111111,
> 13288, 13288.0013888889, 13288.0027777778, 13288.0041666667,
> 13288.0055555556), format = structure(c("m/d/y", "h:m:s"), .Names = c("dates",
> "times")), origin = c(1, 1, 1970), class = c("chron", "dates",
> "times")), class = "zoo")
>
> > dput(new)
> structure(c(956.23, NA, NA, 252.3, 244.85, 236.45, NA, NA, NA
> ), .Dim = c(3L, 3L), .Dimnames = list(c("1", "2", "3"), c("P",
> "PAR", "pcp")), index = structure(c(13288, 13288.0013888889,
> 13288.0027777778), format = structure(c("m/d/y", "h:m:s"), .Names = c("dates",
> "times")), origin = c(1, 1, 1970), class = c("chron", "dates",
> "times")), class = "zoo")
>
> ========
>
>



More information about the R-help mailing list