I would do this in two steps:
> out <- merge(x, y, all.x=T) > out Id year var1 var2 var3 1 1 2010 100 5 7 2 1 2011 105 10 8 3 1 2012 110 NA NA 4 2 2010 100 9 6 5 2 2011 105 NA NA 6 2 2012 106 NA NA
Then use na.locf from the zoo package:
library(zoo) > apply(out, 2, na.locf) Id year var1 var2 var3 [1,] 1 2010 100 5 7 [2,] 1 2011 105 10 8 [3,] 1 2012 110 10 8 [4,] 2 2010 100 9 6 [5,] 2 2011 105 9 6 [6,] 2 2012 106 9 6
and this can be forcibly applied to data.frame.
> as.data.frame(apply(out, 2, na.locf)) Id year var1 var2 var3 1 1 2010 100 5 7 2 1 2011 105 10 8 3 1 2012 110 10 8 4 2 2010 100 9 6 5 2 2011 105 9 6 6 2 2012 106 9 6
source share