Search code examples
rdataframedplyrlocf

Last observation carried forward (LOCF) for all NA in R


I would like to have all NA values replaced by the Last Observation Carried Forward (LOCF) method in R. The data set I have is below:

Value1        Value2           Value3          Group
100           56               82              Group1
150           NA               97              Group2
NA            66               NA              Group3
120           NA               NA              Group4

I would like to create the following data set:

Value1        Value2           Value3          Group
100           56               82              Group1
150           56               97              Group2
150           66               97              Group3
120           66               97              Group4

Any insight on how to do this would be greatly appreciated.


Solution

  • You could use fill from tidyr.

    tidyr::fill(df, everything())
    
    #  Value1 Value2 Value3  Group
    #1    100     56     82 Group1
    #2    150     56     97 Group2
    #3    150     66     97 Group3
    #4    120     66     97 Group4
    

    Or with zoo::na.locf

    df[] <- lapply(df, zoo::na.locf)
    

    data

    df <- structure(list(Value1 = c(100L, 150L, NA, 120L), Value2 = c(56L, 
    NA, 66L, NA), Value3 = c(82L, 97L, NA, NA), Group = structure(1:4, 
    .Label = c("Group1", "Group2", "Group3", "Group4"), class = "factor")), 
    class = "data.frame", row.names = c(NA, -4L))