通过分组变量分配观察水平值

时间:2020-05-04 00:27:29

标签: r

在此先感谢您的帮助。

我有以下数据框

> 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

2 个答案:

答案 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)))