Назначьте значения уровня наблюдения путем группировки переменных - PullRequest
0 голосов
/ 04 мая 2020

Заранее благодарен за любую помощь.

У меня есть приведенный ниже кадр данных

> 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 голосов
/ 04 мая 2020

Предполагая, что человек будет d ie только один раз, мы также можем использовать cumsum.

Сначала заменить NA в смертности на 0 в cum.survival.

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

ИЛИ match:

df %>%  
  group_by(id) %>%  
  mutate(cum.survival = +(row_number() >= match(1, mortality)))
0 голосов
/ 04 мая 2020

Опция, использующая 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))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...