Расчет временных интервалов для длинных данных - PullRequest
0 голосов
/ 23 мая 2019

Я смотрю на построение анализа выживания повторяющихся событий и пытаюсь понять, как рассчитать временные интервалы между событиями.Мои данные в длинном формате, в каждой строке указывается эпизод больницы и возраст (в месяцах) в эпизоде.Моя проблема в том, что для анализа мне нужно рассчитать время между эпизодами для каждого участника.Я понимаю, что это, вероятно, потребует простой зацикливания / повторения между участниками, но я не могу понять, как получить время между событиями n и n-1 внутри каждого участника.

Я нашел предыдущий вопрос Разница между датой и временем между строками в R , который частично отвечает на мой вопрос, но не дает мне никаких идей о том, как реализовать это для нескольких событий, для каждого участника, где количество событий отличается для каждого участника.

            [ID] [age_of_hosp]
    [1,] 3600001  872
    [2,] 3600001  874
    [3,] 3600001  868
    [4,] 3600001  882
    [5,] 3600001  873
    [6,] 3600001  870
    [7,] 3600001  869
    [8,] 3600001  562
    [9,] 3600001  871
   [10,] 3600001  873
   [11,] 3600001  885
   [12,] 3600001  868
   [13,] 3600001  852
   [14,] 3600001  887
   [15,] 3600001  885
   [16,] 3600001  887
   [17,] 3600001  853
   [18,] 3600001  617
   [19,] 3600001  885
   [20,] 3600001  874
   [21,] 3600001  617
   [22,] 3600001  871
   [23,] 3600001  851
   [24,] 3600002   NA
   [25,] 3600003   NA
   [26,] 3600004  865
   [27,] 3600005  655
   [28,] 3600005  667
   [29,] 3600005  656
   [30,] 3600005  664
   [31,] 3600006  814
   [32,] 3600006  821
   [33,] 3600006  821
   [34,] 3600006  755
   [35,] 3600006  813

Любые советы или указатели были бы хорошими!

1 Ответ

1 голос
/ 23 мая 2019

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