Подсчет пациентов, если они удовлетворяют определенным критериям в R, но в разные моменты времени с tidyverse и lubridate - PullRequest
0 голосов
/ 27 июня 2018

переполнения,

У меня есть проблема для подсчета пациентов:

  • выполнение определенных критериев, но в другой момент времени. Для проблемы, которую я пытаюсь решить, разные моменты времени - это даты, но округленные до последнего дня месяца. Как видите, у меня есть пациенты до 2011 года, у которых даты датируются в 2008, 2009 и 2010 годах. Затем они будут засчитаны до 2011-01-31 даты. С другими датами, начиная с 2011 года в приходах, они будут засчитаны в округленную дату (последний день месяца).

Критерии для подсчета пациента:

  • пациент был выписан и ему был поставлен диагноз.

Вот пример:

У меня есть идентификатор

ID = c(101, 102,103, 104, 105, 106, 107, 108, 109,110, 111, 112, 113, 114)

У меня есть даты регистрации

Reg.date = as.POSIXct(c("2008-01-14", "2008-03-19", "2009-06-13", 
                        "2010-08-17", "2011-09-11", "2012-08-14",
                        "2013-09-21",   "2013-08-09", "2014-02-15", 
                        "2014-07-22",  "2015-03-13",  "2015-05-30" , 
                         "2017-01-26", "2017-01-01"))

Я вычел дату -Deduct.date- со значениями NA, это означает, что пациенты все еще живы. Там, где есть даты, это означает, что пациенты выписаны. То же самое с диагнозом - NA означает, что пациент не был диагностирован.

Deduct.date = as.POSIXct(c("2008-09-16 ", "2010-01-13", "2010-02-12", 
                           "2011-02-12",    NA,       "2012-02-12",
                           "2012-02-12",     NA,           NA,
                             NA,           "2014-04-12",   NA,
                             NA,          "2017-02-11" ))

Diagnosis = as.POSIXct(c("2008-05-11" , "2009-03-13", "2009-01-03",
                            NA,         NA,           NA,
                          "2011-04-05",   NA,           NA,
                          "2013-03-05",   NA,            NA,
                          NA))

df = data.frame (ID, Reg.date, Deduct.date)

Я хочу сделать это с помощью tidyverse и lubridate. И результат может быть представлен в кадре данных с подсчетом округленных дат, со ссылкой на те, которые указаны выше.

1 Ответ

0 голосов
/ 27 июня 2018

Вот мое решение, используя lubridate:

library(dplyr)
library(lubridate)

ID = c(101, 102,103, 104, 105, 106, 107, 108, 109,110, 111, 112, 113, 114)

Reg.date = as.POSIXct(c("2008-01-14", "2008-03-19", "2009-06-13", 
                        "2010-08-17", "2011-09-11", "2012-08-14",
                        "2013-09-21",   "2013-08-09", "2014-02-15", 
                        "2014-07-22",  "2015-03-13",  "2015-05-30", 
                        "2017-01-26", "2017-01-01"))

Deduct.date = as.POSIXct(c("2008-09-16 ", "2010-01-13", "2010-02-12", 
                           "2011-02-12",    NA,       "2012-02-12",
                           "2012-02-12",     NA,           NA,
                           NA,           "2014-04-12",   NA,
                           NA,          "2017-02-11" ))

Diagnosis = as.POSIXct(c("2008-05-11" , "2009-03-13", "2009-01-03",
                         NA,         NA,           NA,
                         "2011-04-05",   NA,           NA,
                         "2013-03-05",   NA,            NA,
                         NA))

# Convert dates to lubridate date objects
(df <- data.frame(ID, Reg.date, Deduct.date) %>% 
  mutate(Reg.date = as_date(Reg.date), Deduct.date = as_date(Deduct.date)))
#>     ID   Reg.date Deduct.date
#> 1  101 2008-01-14  2008-09-16
#> 2  102 2008-03-19  2010-01-13
#> 3  103 2009-06-13  2010-02-12
#> 4  104 2010-08-17  2011-02-12
#> 5  105 2011-09-11        <NA>
#> 6  106 2012-08-14  2012-02-12
#> 7  107 2013-09-21  2012-02-12
#> 8  108 2013-08-09        <NA>
#> 9  109 2014-02-15        <NA>
#> 10 110 2014-07-22        <NA>
#> 11 111 2015-03-13  2014-04-12
#> 12 112 2015-05-30        <NA>
#> 13 113 2017-01-26        <NA>
#> 14 114 2017-01-01  2017-02-11

# Prior to 2011 dates
df[!is.na(df$Reg.date) & !is.na(df$Deduct.date) & 
     df$Reg.date < as_date('2011-01-01'),]$Reg.date <- as_date('2011-01-31')

df[!is.na(df$Deduct.date) & !is.na(df$Deduct.date) & 
     df$Deduct.date < as_date('2011-01-01'),]$Deduct.date <- as_date('2011-01-31')

# 2011 onwards
lastDayOfMonth_Reg <- df[!is.na(df$Reg.date) & !is.na(df$Deduct.date) & 
                           df$Reg.date > as_date('2011-01-01'),]$Reg.date %>% 
  ceiling_date('month') - 1
df[!is.na(df$Reg.date) & !is.na(df$Deduct.date) & 
     df$Reg.date > as_date('2011-01-01'),]$Reg.date <- lastDayOfMonth_Reg

lastDayOfMonth_Deduct <- df[!is.na(df$Reg.date) & !is.na(df$Deduct.date) & 
                              df$Deduct.date > as_date('2011-01-01'),]$Deduct.date %>% 
  ceiling_date('month') - 1
df[!is.na(df$Reg.date) & !is.na(df$Deduct.date) & 
     df$Deduct.date > as_date('2011-01-01'),]$Deduct.date <- lastDayOfMonth_Deduct

df
#>     ID   Reg.date Deduct.date
#> 1  101 2011-01-31  2011-01-31
#> 2  102 2011-01-31  2011-01-31
#> 3  103 2011-01-31  2011-01-31
#> 4  104 2011-01-31  2011-02-28
#> 5  105 2011-09-11        <NA>
#> 6  106 2012-08-31  2012-02-29
#> 7  107 2013-09-30  2012-02-29
#> 8  108 2013-08-09        <NA>
#> 9  109 2014-02-15        <NA>
#> 10 110 2014-07-22        <NA>
#> 11 111 2015-03-31  2014-04-30
#> 12 112 2015-05-30        <NA>
#> 13 113 2017-01-26        <NA>
#> 14 114 2017-01-31  2017-02-28

Я не знаю невероятно элегантного способа применения условия фильтра и одновременного изменения определенных столбцов dplyr с помощью функций mutate_[if/all/at], поэтому я также использовал некоторую базу R.

[Примечание: я включил здесь пример данных для воспроизводимости, так как мой эксперт рассмотрел редактирование некоторых исправлений к образцу данных OP, то есть кавычки / NA кавычки / орфография и т. Д. Все еще ожидаются]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...