2013-09-24 27 views
2

我创建此存活模型(具有多个曲线)..如何将survfit结果转换为等于strata data.table?

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

..和所得适合对象并将结果存储在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 

我需要这个数据提取到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 

有没有一种简单的方法做到这一点 - 还是我错过了一些明显的东西?

回答

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分开的载体,然后为每个具有固定数量的n行的data.table,最后堆叠它们全部连同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 
+1

'rbindlist'应当快'减少(rbind',IIUC 。 –

+0

Thanks!更新了答案。 – Backlin

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 
+0

data.table有趣的行为。我没想到他们会按键自动排序,也不是键不必是唯一的。 – Backlin