Используйте ave
для обработки группировки, а затем na.locf0
для переноса последнего вхождения не-NA и na.fill
для заполнения того, что осталось с 0.
library(zoo)
transform(DF, action = na.fill(ave(action, user, FUN = na.locf0), 0))
, давая:
user action
1 1 0
2 1 2
3 1 2
4 1 2
5 1 3
6 1 3
7 2 0
8 2 0
9 2 1
10 2 1
Примечание
Ввод в воспроизводимой форме:
DF <- structure(list(user = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L
), action = c(NA, 2L, NA, NA, 3L, NA, NA, NA, 1L, NA)),
class = "data.frame", row.names = c(NA, -10L))