Online training class for Clinical R programming batch starts on Monday, 02Feb2026.
Click here for details.
#==============================================================================;
#Retain last non-missing score;
#==============================================================================;
lnms <- tribble(
~usubjid,~visitnum,~score,
101,1,20,
101,2,NA,
101,3,30,
102,1,90,
102,2,10,
102,3,NA,
102,4,NA
)
lnms01 <- lnms %>%
mutate(orig_score=score) %>%
arrange(usubjid,visitnum) %>%
group_by(usubjid) %>%
fill(score,.direction="down") lnms <- data.frame(
usubjid = c(101, 101, 101, 102, 102, 102, 102),
visitnum = c(1, 2, 3, 1, 2, 3, 4),
score = c(20, NA, 30, 90, 10, NA, NA)
, stringsAsFactors = FALSE
)
lnms01 <- lnms[order(lnms$usubjid, lnms$visitnum), ]
lnms01$orig_score <- lnms01$score
lnms01$score <- ave(lnms01$score, lnms01$usubjid, FUN = function(x) {
last <- NA
for (i in seq_along(x)) {
if (!is.na(x[i])) {
last <- x[i]
} else if (!is.na(last)) {
x[i] <- last
}
}
x
})