在此先感谢您的帮助。
我有以下数据框
> df <- data.frame(
id = c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5),
time = c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6),
mortality = c(NA,1,0,0,0,0,NA,0,0,0,0,1,NA,0,0,0,0,0,NA,0,0,1,0,0,NA,0,1,0,0,0)
)
> head(df)
id time mortality
1 1 1 NA
2 1 2 1
3 1 3 0
4 1 4 0
5 1 5 0
6 1 6 0
df$id
代表在整个生存过程中六个时间点测得的个体。在试验开始时,所有个体都还活着,然后死亡或存活。 df$mortality
代表该个人在哪个时间段内死亡,例如,个人1在时间段2上死亡。
我想创建一个新变量,该变量表示我所谓的累积生存期。这将表明该个人是在当前时间段内还是之前的任何时间段内死亡。我该如何编码?
我使用ifelse()
语句和dplyr group_by()
尝试了多种方法,但均未成功。
下面是新数据框的外观。谢谢
> df
id time mortality cum.survival
1 1 1 NA 0
2 1 2 1 1
3 1 3 0 1
4 1 4 0 1
5 1 5 0 1
6 1 6 0 1
7 2 1 NA 0
8 2 2 0 0
9 2 3 0 0
10 2 4 0 0
11 2 5 0 0
12 2 6 1 1
13 3 1 NA 0
14 3 2 0 0
15 3 3 0 0
16 3 4 0 0
17 3 5 0 0
18 3 6 0 0
19 4 1 NA 0
20 4 2 0 0
21 4 3 0 0
22 4 4 1 1
23 4 5 0 1
24 4 6 0 1
25 5 1 NA 0
26 5 2 0 0
27 5 3 1 1
28 5 4 0 1
29 5 5 0 1
30 5 6 0 1
答案 0 :(得分:0)
使用by
的选项:
df$cum.survival <- unlist(by(df$mortality, df$id, function(x) cummax(replace(x, is.na(x), 0L))))
或ave
:
df$cum.survival <- ave(df$mortality, df$id, FUN=function(x) cummax(replace(x, is.na(x), 0L)))
或tapply
:
df$cum.survival <- unlist(tapply(df$mortality, df$id, FUN=function(x) cummax(replace(x, is.na(x), 0L))))
答案 1 :(得分:0)
假设这个人只会死一次,我们也可以使用cumsum
。
首先将NA
中的死亡率cum.survival
替换为0。
df <- transform(df, cum.survival = replace(mortality, is.na(mortality), 0))
然后我们可以使用基数R:
df$cum.survival <- with(df, ave(cum.survival, id, FUN = cumsum))
dplyr
:
library(dplyr)
df %>% group_by(id) %>% mutate(cum.survival = cumsum(cum.survival))
或data.table
:
library(data.table)
setDT(df)[, cum.survival := cumsum(cum.survival), id]
另一种选择是将组中的行索引与存在1的索引相匹配。
我们可以使用which.max
:
df %>%
group_by(id) %>%
mutate(cum.survival = +(row_number() >= which.max(mortality)))
OR match
:
df %>%
group_by(id) %>%
mutate(cum.survival = +(row_number() >= match(1, mortality)))