#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. Я отредактировал сообщение более точно, чтобы описать, как рассчитываются дни.