Присвойте значение, основанное на возрасте возникновения события в R - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть продольный набор данных с возрастом участника и переменной, показывающей возраст, в котором участник пережил событие (0/1), следующим образом.

id  age  event
 1    0     0
 1    1     0
 1    2     0
 1    3     0
 1    4     0
 1    5     0
 2    0     0
 2    1     1
 2    2     1
 2    3     1
 2    4     1
 2    5     1 
 3    0     0
 3    1     0
 3    2     0
 3    3     1
 3    4     1
 3    5     1

На основе того, произошло ли событие никогда ( 0) или это произошло в возрасте до 2 лет (1) или после 2 лет (2), я хочу сгенерировать новую переменную, называемую временем, и назначить каждого участника в группу (0,1,2) следующим образом:

id  age  event  timing  
 1    0     0      0
 1    1     0      0
 1    2     0      0
 1    3     0      0
 1    4     0      0
 1    5     0      0
 2    0     0      1
 2    1     1      1
 2    2     1      1
 2    3     1      1
 2    4     1      1
 2    5     1      1
 3    0     0      2
 3    1     0      2
 3    2     0      2
 3    3     1      2
 3    4     1      2
 3    5     1      2

Я не обладаю хорошими навыками кодирования и буду очень признателен, если кто-нибудь сможет помочь.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Вы указали условия cla sh с ожидаемым результатом. Поэтому трудно точно знать, что вам нужно. Интуитивно понятно, что значение в timing всегда должно быть 0 независимо от возраста участника, если событие никогда не происходило. Если это правильно, то следующие вложенные предложения ifelse создают новую переменную:

df$timing <- ifelse(df$event==0, 0,
                    ifelse(df$event==1 & df$age==1, 1, 2))

Результат:

df
   id age event timing
1   1   0     0      0
2   1   1     0      0
3   1   2     0      0
4   1   3     0      0
5   1   4     0      0
6   1   5     0      0
7   2   0     0      0
8   2   1     1      1
9   2   2     1      2
10  2   3     1      2
11  2   4     1      2
12  2   5     1      2
13  3   0     0      0
14  3   1     0      0
15  3   2     0      0
16  3   3     1      2
17  3   4     1      2
18  3   5     1      2
0 голосов
/ 11 февраля 2020

1.Создать минимальный воспроизводимый пример :

df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L),
                     age = c(0L, 1L, 2L, 3L, 4L,5L, 0L, 1L, 2L, 3L, 4L, 5L, 0L, 1L, 2L, 3L, 4L, 5L),
                     event = c(0L,0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L,1L)),
                row.names = c(NA, -18L), class = "data.frame")

2. Решение с использованием dplyr:

library(dplyr)

df %>% 
  left_join(df %>% 
              mutate(timing = if_else(age < 2 & event == 1, 1,
                                      if_else(age >= 2 & event == 1, 2, 0))) %>% 
              group_by(id) %>%
              summarize(timing = ifelse(1 %in% timing, 1,
                                        ifelse(2 %in% timing, 2, 0)))
  )

Возвращает:

   id age event timing
1   1   0     0      0
2   1   1     0      0
3   1   2     0      0
4   1   3     0      0
5   1   4     0      0
6   1   5     0      0
7   2   0     0      1
8   2   1     1      1
9   2   2     1      1
10  2   3     1      1
11  2   4     1      1
12  2   5     1      1
13  3   0     0      2
14  3   1     0      2
15  3   2     0      2
16  3   3     1      2
17  3   4     1      2
18  3   5     1      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...