Если вы открыты для решений, использующих пакеты, такие как tibble
и dplyr
из популярного tidyverse
набора R
пакетов, вы можете попробовать это:
Сначала, чтобы воссоздать ваши данныеиспользуя функцию tribble
:
library(tibble)
ages <- tribble(
~id, ~age_of_hosp,
3600001, 872,
3600001, 874,
3600001, 868,
3600001, 882,
3600001, 873,
3600001, 870,
3600001, 869,
3600001, 562,
3600001, 871,
3600001, 873,
3600001, 885,
3600001, 868,
3600001, 852,
3600001, 887,
3600001, 885,
3600001, 887,
3600001, 853,
3600001, 617,
3600001, 885,
3600001, 874,
3600001, 617,
3600001, 871,
3600001, 851,
3600002, NA,
3600003, NA,
3600004, 865,
3600005, 655,
3600005, 667,
3600005, 656,
3600005, 664,
3600006, 814,
3600006, 821,
3600006, 821,
3600006, 755,
3600006, 813
)
Затем приступим к работе:
- Функция, которую вы ищете ниже, это просто
lag
.Находит предыдущее значение.А если вы не знакомы с оператором канала (%>%
), он берет результаты предыдущей функции и «передает» их в следующую. - Сначала я отфильтровал
NA
записей.Не уверен, что вы хотели сделать с ними. - Затем я определяю по ID и возрасту больницы, на случай, если они еще не упорядочены в этом порядке.
- Группировка по
id
гарантирует, что когда мы используем лаг, мы получаем последнюю запись для этого инцидента , а не только в целом. mutate
изменяет поля или создает новые.Здесь я использую его, чтобы создать поле last_incident_age
, а затем повернуть направо и использовать его, чтобы получить разницу во времени в месяцах. glimpse
- это просто хороший способ взглянуть на ваш результирующий набор данных.;)
library(dplyr)
ages %>%
filter(!is.na(age_of_hosp)) %>%
arrange(id, age_of_hosp) %>%
group_by(id) %>%
mutate(
last_incident_age = lag(age_of_hosp, 1, default = NA),
months_since_last = age_of_hosp - last_incident_age
) %>%
glimpse()