Дата преобразования набора данных на временную шкалу в R

#r #date #tidyverse #summary #wrangle

#r #Дата #tidyverse #Краткие сведения #пререкания

Вопрос:

У меня сложная проблема с использованием дат в наборе данных. Позвольте мне описать проблему и привести пример.

Данные — это данные больницы, где у нас есть информация, когда человек получил окончательный диагноз (key_date) и данные о событиях, когда человек был в больнице (date_in, date_out).

 library(tidyverse)

sample_size = 1000
d <- tibble(id = seq(1, sample_size, 1), 
           key_date = sample(seq(as.Date('2004/01/01'), as.Date('2009/01/01'), by="day"), sample_size, replace = T),
           date_in = sample(seq(as.Date('1999/01/01'), as.Date('2005/01/01'), by="day"), sample_size, replace = T)) %>% 
  mutate(
    date_out = date_in   sample(seq(1,20, 1), sample_size, replace = T)    
  )
d


# A tibble: 1,000 x 4
      id key_date   date_in    date_out  
   <dbl> <date>     <date>     <date>    
 1     1 2004-12-11 1999-08-03 1999-08-16
 2     2 2007-04-07 2002-10-29 2002-11-07
 3     3 2006-11-04 2002-07-10 2002-07-14
 4     4 2008-05-17 2001-08-14 2001-08-21
 5     5 2006-10-23 2004-06-17 2004-07-04
 6     6 2004-12-22 2002-02-27 2002-03-06
 7     7 2007-01-13 2001-05-27 2001-06-14
 8     8 2005-01-11 1999-09-17 1999-09-24
 9     9 2008-04-06 2000-10-05 2000-10-07
10    10 2007-03-15 1999-06-13 1999-06-23
 

Мы хотим поместить всех пациентов в одну временную шкалу, чтобы в новом масштабе у каждого человека был диагноз в точке 0. В связи с этим мы также масштабируем переменные date_in и date_out на эту временную шкалу.

 d <- d %>% 
  mutate(date_in_new = date_in - key_date   1,
         date_out_new = date_out - key_date) 

d
# A tibble: 1,000 x 6
      id key_date   date_in    date_out   date_in_new date_out_new
   <dbl> <date>     <date>     <date>     <drtn>      <drtn>      
 1     1 2004-12-11 1999-08-03 1999-08-16 -1956 days  -1944 days  
 2     2 2007-04-07 2002-10-29 2002-11-07 -1620 days  -1612 days  
 3     3 2006-11-04 2002-07-10 2002-07-14 -1577 days  -1574 days  
 4     4 2008-05-17 2001-08-14 2001-08-21 -2467 days  -2461 days  
 5     5 2006-10-23 2004-06-17 2004-07-04  -857 days   -841 days  
 6     6 2004-12-22 2002-02-27 2002-03-06 -1028 days  -1022 days  
 7     7 2007-01-13 2001-05-27 2001-06-14 -2056 days  -2039 days  
 8     8 2005-01-11 1999-09-17 1999-09-24 -1942 days  -1936 days  
 9     9 2008-04-06 2000-10-05 2000-10-07 -2739 days  -2738 days  
10    10 2007-03-15 1999-06-13 1999-06-23 -2831 days  -2822 days  
 

Затем мы хотим подсчитать, сколько пациентов находилось в больнице 1 год, 2 года и так далее до постановки диагноза. Например, данные для первых 3 строк исходных данных будут выглядеть следующим образом:

 year; days; patients
-6; 13; 1
-5; 13; 2
 

Это означает, что дни считаются как количество дней, проведенных человеком в больнице, в новой масштабированной переменной даты. Возможно, что одно и то же «событие» разделено на два или более года. Год здесь означает 365 дней, и эта справочная таблица помогает понять, каковы дневные ограничения для каждого года:

 year; day_limits
2; c(730, 1094)
1; c(365, 729)
0; c(0, 364)
-1; c(-1 , -365)
-2; c(-366, -730)
-3; c(-731, -1095)
-4; c(-1096, -1460)
-5; c(-1461, -1825)
-6; c(-1826, -2190)
 

Какой самый лучший и быстрый способ выполнить этот расчет? Я знаю, что это можно сделать, выполнив цикл for через весь набор данных и проверив, какие строки идентифицируются с годом, но я нахожу это медленным. Идея состоит в том, чтобы получить фрейм данных с переменными

  • год: переменная в зависимости от временной шкалы. 1,2,3,4, … лет до диагностики, а также 1,2,3,4, … лет после диагностики
  • пациенты: насколько разные идентификаторы были в больнице
  • дни: сколько дней пациенты провели в больнице в течение года

Вся идея этого перебора данных состоит в том, чтобы визуализировать, как количество дней, проведенных пациентами в больнице, растет до «реального» диагноза. Скорее всего, реальные данные выглядят так

введите описание изображения здесь

Комментарии:

1. Как вы вычисляете days столбец?

2. Я отредактировал сообщение более точно, чтобы описать, как рассчитываются дни.