Вы можете сгруппировать (я использую dplyr) свой data.frame (я использую tibble) по идентификатору, а затем создать новые переменные, которые указывают, является ли для каждого идентификатора первый год наблюдение было 1989 г., умер ли человек под наблюдением и равно ли количество строк на идентификатор промежутку времени (max_year - min_year + 1). В этом случае я бы сказал, что ID 2 не подвергается цензуре, поскольку ее первый год наблюдения - 1989 год, который вы определяете как начальный год.
library(tibble)
library(dplyr)
id <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
year <- c(1990, 1991, 1992, 1989, 1990, 1991, 1992, 1993, 1989, 1990, 1992, 1993)
deceased <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1)
df <- tibble(id, year, deceased)
start_year <- 1989
df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year, ## left censored, if first year is after 1988
right_censored = max(deceased) == 0, ## right censored, if did not die within observation
has_gaps = n() < max(year) - min(year) + 1) ## has gaps,
Результат:
# A tibble: 12 x 6
# Groups: id [3]
id year deceased left_censored right_censored has_gaps
<dbl> <dbl> <dbl> <lgl> <lgl> <lgl>
1 1 1990 0 TRUE FALSE FALSE
2 1 1991 0 TRUE FALSE FALSE
3 1 1992 1 TRUE FALSE FALSE
4 2 1989 0 FALSE TRUE FALSE
5 2 1990 0 FALSE TRUE FALSE
6 2 1991 0 FALSE TRUE FALSE
7 2 1992 0 FALSE TRUE FALSE
8 2 1993 0 FALSE TRUE FALSE
9 3 1989 0 FALSE FALSE TRUE
10 3 1990 0 FALSE FALSE TRUE
11 3 1992 0 FALSE FALSE TRUE
12 3 1993 1 FALSE FALSE TRUE
Изменить. Если вам нужен обзор, вы можете добавить:
df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year, ## left censored, if first year is after 1988
right_censored = max(deceased) == 0, ## right censored, if did not die within observation
has_gaps = n() < max(year) - min(year) + 1) %>%## has gaps,
dplyr::distinct(id, left_censored, right_censored, has_gaps) %>%
ungroup() %>%
summarise(left_censored = sum(left_censored), right_censored = sum(right_censored), has_gaps = sum(has_gaps))
И получить:
# A tibble: 1 x 3
left_censored right_censored has_gaps
<int> <int> <int>
1 1 1 1
Как я упоминал ранее: здесь ID 2 не считается подвергнутым левой цензуре, так как ее начальная дата — 1989 год.
Edit2: если вы уберете ungroup(), вы получите обзор, который вы просили:
df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year, ## left censored, if first year is after 1988
right_censored = max(deceased) == 0, ## right censored, if did not die within observation
has_gaps = n() < max(year) - min(year) + 1) %>%## has gaps,
dplyr::distinct(id, left_censored, right_censored, has_gaps) %>%
summarise(left_censored = sum(left_censored), right_censored = sum(right_censored), has_gaps = sum(has_gaps))
и получить:
id left_censored right_censored has_gaps
<dbl> <int> <int> <int>
1 1 1 0 0
2 2 0 1 0
3 3 0 0 1
person
Chris
schedule
10.12.2020