我正在努力编写一个函数,可以在单个分层变量存在的情况下轻松地在特定时间点提取生存估计值。这是一个例子:
dat <-
data.frame(time = floor(runif(1000, 1, 101)),
status = rbinom(1000, 1, p = 0.2),
group = c("West European", "East European", "African", "Asian",
"North American Native", "South American Native")[floor(runif(1000, 1, 7))]
)
head(dat)
time status group
1 44 1 West European
2 67 0 West European
3 98 0 South American Native
4 59 0 Asian
5 63 1 North American Native
6 5 0 North American Native
fit <- survfit(Surv(dat$time, dat$status) ~ dat$group)
str(fit)
List of 14
$ n : int [1:6] 151 157 170 171 176 175
$ time : num [1:488] 1 2 3 7 8 9 10 11 13 14 ...
$ n.risk : num [1:488] 151 150 149 148 147 145 143 142 141 139 ...
$ n.event : num [1:488] 0 0 0 0 0 1 1 0 0 0 ...
$ n.censor : num [1:488] 1 1 1 1 2 1 0 1 2 2 ...
$ surv : num [1:488] 1 1 1 1 1 ...
$ type : chr "right"
$ strata : Named int [1:6] 78 82 79 80 82 87
..- attr(*, "names")= chr [1:6] "dat$group=African" "dat$group=Asian"
"dat$group=East European" "dat$group=North American Native" ...
$ std.err : num [1:488] 0 0 0 0 0 ...
$ upper : num [1:488] 1 1 1 1 1 1 1 1 1 1 ...
$ lower : num [1:488] 1 1 1 1 1 ...
$ conf.type: chr "log"
$ conf.int : num 0.95
$ call : language survfit(formula = Surv(dat$time, dat$status) ~ dat$group)
- attr(*, "class")= chr "survfit"
正如我所看到的,调用“survfit”的结果是一个列表,其中包含一些包含数据的元素,以及一些包含元数据的元素(如分层变量的级别或函数调用本身)。我想构建一个可以循环包含数据的元素并将它们排列成一个漂亮的数据帧的函数。例如,假设我想要6个一周的生存估计(每组一个)。这些发生在指数
which(fit$time == 7)
[1] 4 84 166 245 324 408
但显然我不能简单地从列表的每个元素中提取这些索引。有没有一种方便的方法可以创建一个只包含预先指定的fit
元素的小列表?在这种情况下,fit$time
,fit$n.risk
等(包含488个元素的所有项目)都需要包含在通话中。
我做了几次尝试,比如
lapply(fit[[c(2, 3, 6)]], function(x) x[which(fit$time == 7)])
但继续遇到
Error in fit[[c(2, 3, 6)]] : recursive indexing failed at level 2
这意味着我仍然需要了解索引列表。关于如何通过lapply
电话访问列表的特定元素的任何想法?