Wdataclean2 <- function (z, d, wt = rep(1,length(z)) ) { # version 1, 2001-11. Mai Zhou # does this work for doubly censored data too? YES! # d=1---uncensor; d=0---right censor; d=2---left censor. niceorder<-order(z,-d) sortedz<-z[niceorder] sortedd<-d[niceorder] sortedw<-wt[niceorder] n <- length(sortedd) y1 <- sortedz[-1] != sortedz[-n] y2 <- sortedd[-1] != sortedd[-n] y <- y1 | y2 ind <- c(which(y | is.na(y)), n) csumw <- cumsum(sortedw) list( value = sortedz[ind], dd = sortedd[ind], weight = diff(c(0, csumw[ind])) ) } DnR <- function(x, d, w) { # data input should be from Wdataclean2() # should be used only for right censored data. posi <- d == 1 uncenx <- x[posi] uncenw <- w[posi] allrisk <- rev(cumsum(rev(w))) uncenR <- allrisk[posi] list( time = uncenx, n.risk = uncenR, n.event = uncenw ) }