Генерация данных для анализа выживания в r - PullRequest
0 голосов
/ 31 марта 2020

У меня есть датафрейм, который записывает, если человек принимал определенное лекарство каждый год:

df_og <- data.frame(
  id=c(1,1,1,2,2,2,3,3,3,3),
  year=c(2001,2002,2003,2001,2002,2003,2000,2001,2002,2003),
  med1=c(1,1,1,1,1,0,0,0,0,1),
  med2=c(0,0,0,0,0,1,0,0,1,0),
  med3=c(0,0,0,0,0,0,1,1,0,0)
)

, который выглядит следующим образом:

id  year   med1 med2 med3 
1   2001    1    0    0
1   2002    1    0    0
1   2003    1    0    0
2   2001    1    0    0
2   2002    1    0    0
2   2003    0    1    0
3   2000    0    0    1
3   2001    0    0    1
3   2002    0    1    0
3   2003    1    0    0

Итак, столбец id показывает идентификатор субъект, year год наблюдения, и переменные med1-2-3 являются фиктивными со значением = 1, если препарат был принят, и = 0, если нет.

Я пытаюсь создать новый фрейм данных :

  id = c(1,2,2,3,3,3),
  time = c(3,2,1,2,1,1),
  failure = c(0,1,0,1,1,0),
  group = c(1,1,2,3,2,1)) 

выглядит следующим образом:

  id  time failure med_group
   1   3      0        1
   2   2      1        1
   2   1      0        2
   3   2      1        3
   3   1      1        2
   3   1      0        1

где: id показывает идентификатор субъекта, time подсчитывает количество последовательных лет, когда субъект принимал определенное лекарство, failure если в указанные годы субъект сменил препарат, med_group препарат, который субъект принимал.

Примеры:

  1. первый ряд df, субъект id=1 принимает med1 в течение 3 лет подряд, поэтому time=3 и не переключается на других, поэтому failure=0.
  2. второй ряд df, id=2 принимает med1 2 года подряд, поэтому time=2, failure=0, med_group=1. Но затем переключился на med2, так что time=1, failure=1 и med_group=2.

и так далее для остальных. Это сложная операция, поэтому я надеюсь, что вопрос достаточно ясен.

Любое предложение будет приветствоваться! Приветствия

1 Ответ

1 голос
/ 31 марта 2020

Мы можем получить данные в длинном формате, удалить строки, где value = 0, replace последнее значение в каждом id до 0, что указывает на отсутствие ошибок. Затем мы group_by name посчитаем количество строк в каждой группе и если failure произошло или нет.

library(dplyr)

df_og %>%
  tidyr::pivot_longer(cols = starts_with('med')) %>%
  filter(value != 0) %>%
  group_by(id) %>%
  mutate(value = replace(value, n(), 0)) %>%
  group_by(name, add = TRUE) %>%
  summarise(time = n(), 
            failure = +all(value == 1))


#     id name   time failure
#  <dbl> <chr> <int>   <int>
#1     1 med1      3       0
#2     2 med1      2       1
#3     2 med2      1       0
#4     3 med1      1       0
#5     3 med2      1       1
#6     3 med3      2       1
...