我已经创建了这个生存模型(有多条曲线)..
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
有没有一种简单的方法可以做到这一点 - 或者我完全错过了一些明显的东西?
答案 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