# na.approx

##### Replace NA by Interpolation

Generic functions for replacing each `NA`

with interpolated
values.

- Keywords
- ts

##### Usage

```
na.approx(object, …)
# S3 method for zoo
na.approx(object, x = index(object), xout, …, na.rm = TRUE, along)
# S3 method for zooreg
na.approx(object, …)
# S3 method for ts
na.approx(object, …)
# S3 method for default
na.approx(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)
```na.spline(object, …)
# S3 method for zoo
na.spline(object, x = index(object), xout, …, na.rm = TRUE, along)
# S3 method for zooreg
na.spline(object, …)
# S3 method for ts
na.spline(object, …)
# S3 method for default
na.spline(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)

##### Arguments

- object
object in which

`NA`

s are to be replaced- x, xout
Variables to be used for interpolation as in

`approx`

.- na.rm
logical. If the result of the (spline) interpolation still results in

`NA`

s, should these be removed?- maxgap
maximum number of consecutive

`NA`

s to fill. Any longer gaps will be left unchanged. Note that all methods listed above can accept`maxgap`

as it is ultimately passed to the`default`

method.- along
deprecated.

- …
further arguments passed to methods. The

`n`

argument of`approx`

is currently not supported.

##### Details

Missing values (`NA`

s) are replaced by linear interpolation via
`approx`

or cubic spline interpolation via `spline`

,
respectively.

It can also be used for series disaggregation by specifying `xout`

.

By default the index associated with `object`

is used
for interpolation. Note, that if this calls `index.default`

this gives an equidistant spacing `1:NROW(object)`

. If `object`

is a matrix or data.frame, the interpolation is done separately for
each column.

If `obj`

is a plain vector then `na.approx(obj, x, y, xout, ...)`

returns `approx(x = x[!na], y = coredata(obj)[!na], xout = xout, ...)`

(where `na`

indicates observations with `NA`

) such that `xout`

defaults to `x`

. Note that if there are less than two non-`NA`

s then
`approx()`

cannot be applied and thus no `NA`

s can be replaced.

If `obj`

is a `zoo`

, `zooreg`

or `ts`

object its
`coredata`

value is processed as described and its time index is `xout`

if
specified and `index(obj)`

otherwise. If `obj`

is two dimensional
then the above is applied to each column separately. For examples, see below.

If `obj`

has more than one column, the above strategy is applied to
each column.

##### Value

An object of similar structure as `object`

with `NA`

s replaced by
interpolation. For `na.approx`

only the internal `NA`

s are replaced and
leading or trailing `NA`

s are omitted if `na.rm = TRUE`

or not
replaced if `na.rm = FALSE`

.

##### See Also

`zoo`

, `approx`

, `na.contiguous`

,
`na.locf`

, `na.omit`

, `na.trim`

, `spline`

,
`stinterp`

##### Examples

```
# NOT RUN {
z <- zoo(c(2, NA, 1, 4, 5, 2), c(1, 3, 4, 6, 7, 8))
## use underlying time scale for interpolation
na.approx(z)
## use equidistant spacing
na.approx(z, 1:6)
# with and without na.rm = FALSE
zz <- c(NA, 9, 3, NA, 3, 2)
na.approx(zz, na.rm = FALSE)
na.approx(zz)
d0 <- as.Date("2000-01-01")
z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6)
# NA fill, drop or keep leading/trailing NAs
na.approx(z)
na.approx(z, na.rm = FALSE)
# extrapolate to point outside of range of time points
# (a) drop NA, (b) keep NA, (c) extrapolate using rule = 2 from approx()
na.approx(z, xout = d0 + 7)
na.approx(z, xout = d0 + 7, na.rm = FALSE)
na.approx(z, xout = d0 + 7, rule = 2)
# use splines - extrapolation handled differently
z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6)
na.spline(z)
na.spline(z, na.rm = FALSE)
na.spline(z, xout = d0 + 1:6)
na.spline(z, xout = d0 + 2:5)
na.spline(z, xout = d0 + 7)
na.spline(z, xout = d0 + 7, na.rm = FALSE)
## using na.approx for disaggregation
zy <- zoo(1:3, 2000:2001)
# yearly to monthly series
zmo <- na.approx(zy, xout = as.yearmon(2000+0:13/12))
zmo
# monthly to daily series
sq <- seq(as.Date(start(zmo)), as.Date(end(zmo), frac = 1), by = "day")
zd <- na.approx(zmo, x = as.Date, xout = sq)
head(zd)
# weekly to daily series
zww <- zoo(1:3, as.Date("2001-01-01") + seq(0, length = 3, by = 7))
zww
zdd <- na.approx(zww, xout = seq(start(zww), end(zww), by = "day"))
zdd
# The lines do not show up because of the NAs
plot(cbind(z, z), type = "b", screen = 1)
# use na.approx to force lines to appear
plot(cbind(z, na.approx(z)), type = "b", screen = 1)
# Workaround where less than 2 NAs can appear in a column
za <- zoo(cbind(1:5, NA, c(1:3, NA, 5), NA)); za
ix <- colSums(!is.na(za)) > 0
za[, ix] <- na.approx(za[, ix]); za
# using na.approx to create regularly spaced series
# z has points at 10, 20 and 40 minutes while output also has a point at 30
if(require("chron")) {
tt <- as.chron("2000-01-01 10:00:00") + c(1, 2, 4) * as.numeric(times("00:10:00"))
z <- zoo(1:3, tt)
tseq <- seq(start(z), end(z), by = times("00:10:00"))
na.approx(z, xout = tseq)
}
# }
```

*Documentation reproduced from package zoo, version 1.8-1, License: GPL-2 | GPL-3*