{"word_count": 274, "character_count": 1872}
There are now more than 10,000 R packages available from CRAN, much more if you include those available only on github. So, to be honest, it become difficult to know all of them. But sometimes, you discover a nice function in one of them, and that is really awesome. Consider for instance some (standard) censored lifetime data,n=10000idx=sample(1:4,size=n,replace=TRUE)pd=LETTERS[idx]lambda=1+(idx-1)/3t=rexp(n,lambda)x=rexp(n)c=t&#62;xy=pmin(t,x)df=data.frame(time=y,status=c,product=pd)(yes, I will generate them here). Consider Kaplan-Meier estimator of the survival function,library(survival)km.base = survfit( Surv(time,status) ~ 1  , data = df )plot(km.base)This week end, Anat (currently finishing the Data Science for Actuaries program) made me discover a nice R function, to add information to that graph (well, not that graph, since it will be a ggplot version, but the same survival distribution plot)library(ggplot2)library(survminer)ggsurvplot(km.base, main = "", color = "blue" , censor = FALSE, xlim = c(0,3), risk.table = TRUE ,risk.table.col = "blue" , risk.table.height = 0.2, risk.table.title = "" , legend.labs = "All" , legend.title = "" , break.time.by = 1, xlab = "" , ylab = "")This is more interesting when we have different lifetimeskm.prod = survfit( Surv(time,status) ~ product  , data = df )ggsurvplot(km.prod, main = "", censor = FALSE, xlim = c(0,3), risk.table = TRUE , risk.table.col = "strata" , risk.table.height = 0.3, risk.table.title = "" , legend.labs = LETTERS[1:4] , legend.title = "" , break.time.by = 1, xlab = "" , ylab = "")or, with a different time granularityggsurvplot(km.prod, main = "", censor = FALSE, xlim = c(0,3), risk.table = TRUE , risk.table.col = "strata" , risk.table.height = 0.3, risk.table.title = "" , legend.labs = LETTERS[1:4] , legend.title = "" , break.time.by = .5, xlab = "" , ylab = "")Nice, isn't it?