如何将幸存结果转换为相等的层数data.table?

时间:2013-09-24 09:07:31

标签: r data.table survival-analysis

我已经创建了这个生存模型(有多条曲线)..

obj <- with(subscriptions, Surv(time=life_time, event=status, type="right"))
fit <- survfit(obj~sales_month, data=subscriptions)

..生成的 fit 对象将结果存储在fit$surv中。然而,就我而言,不同曲线/组的生存估计长度不相等。不同曲线的长度可在fit$strata中找到。

基本上数据如下所示:

fit$surv <- 1:10
1  2  3  4  5  6  7  8  9 10

fit$strata <- c(5,3,2)
names(fit$strata) <- LETTERS[1:3]
A B C 
5 3 2

我需要将此数据提取到{strong}等于组长度的data.table,如此...

strata   surv
A        1
A        2
A        3
A        4
A        5
B        6
B        7
B        8
B        NA
B        NA
C        9
C        10
C        NA
C        NA
C        NA

有没有一种简单的方法可以做到这一点 - 或者我完全错过了一些明显的东西?

2 个答案:

答案 0 :(得分:3)

这是另一种非常优雅的方式:

n <- max(strata)
miss <- n-strata
newsurv <- c(surv, rep(NA,sum(miss)))
newnames <- c(rep(names(strata),strata), rep(names(strata), miss))
data.table(strata=newnames, surv=newsurv, key="strata")

给出了:

    strata surv
 1:      A    1
 2:      A    2
 3:      A    3
 4:      A    4
 5:      A    5
 6:      B    6
 7:      B    7
 8:      B    8
 9:      B   NA
10:      B   NA
11:      C    9
12:      C   10
13:      C   NA
14:      C   NA
15:      C   NA

答案 1 :(得分:1)

我不知道有任何预定义的功能能够满足您的需求,但您可以非常轻松地将解决方案整合在一起。它可能不具备简单的条件,但确实可以有效地完成工作。

attach(fit)
n <- max(strata)
rbindlist(mapply(function(st, su){
    data.table(strata = rep(st, n),
               surv = c(su, rep(NA, n - length(su))))
}, names(strata), split(surv, rep(names(strata), strata)), SIMPLIFY=FALSE))

基本上它的作用是将surv的值拆分到基于strata的单独向量中,然后创建 data.table 每个都有固定数量的n行,最后将它们与 rbindlist 一起堆叠起来。

    strata surv
 1:      A    1
 2:      A    2
 3:      A    3
 4:      A    4
 5:      A    5
 6:      B    6
 7:      B    7
 8:      B    8
 9:      B   NA
10:      B   NA
11:      C    9
12:      C   10
13:      C   NA
14:      C   NA
15:      C   NA