Tal Galili - 4 months ago 53

R Question

I wish to implement a "Last Observation Carried Forward" for a data set I am working on which has missing values at the end of it.

Here is a simple code to do it (question after it):

`LOCF <- function(x)`

{

# Last Observation Carried Forward (for a left to right series)

LOCF <- max(which(!is.na(x))) # the location of the Last Observation to Carry Forward

x[LOCF:length(x)] <- x[LOCF]

return(x)

}

# example:

LOCF(c(1,2,3,4,NA,NA))

LOCF(c(1,NA,3,4,NA,NA))

Now this works great for simple vectors. But if I where to try and use it on a data frame:

`a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA))`

a

t(apply(a, 1, LOCF)) # will make a mess

It will turn my data frame into a character matrix.

Can you think of a way to do LOCF on a data.frame, without turning it into a matrix? (I could use loops and such to correct the mess, but would love for a more elegant solution)

Cheers,

Tal

Answer

This already exists:

```
library(zoo)
na.locf(data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)))
```