От новичка до гуру: Курсы программирования на CyberDuff

dplyr или data.table для расчета агрегации временных рядов в R

Я пытаюсь обобщить data.frame, который содержит информацию о дате (или времени).

Предположим, что он содержит записи о госпитализации по каждому пациенту:

df <- data.frame(c(1, 2, 1, 1, 2, 2),
             c(as.Date("2013/10/15"), as.Date("2014/10/15"), as.Date("2015/7/16"), as.Date("2016/1/7"), as.Date("2015/12/20"), as.Date("2015/12/25")))
names(df) <- c("patient.id", "hospitalization.date")

df выглядит так:

> df
      patient.id hospitalization.date
    1          1           2013-10-15
    2          2           2014-10-15
    3          1           2015-07-16
    4          1           2016-01-07
    5          2           2015-12-20
    6          2           2015-12-25

Для каждого наблюдения мне нужно подсчитать количество госпитализаций за 365 дней до этой госпитализации.

В моем примере это будет новый столбец df$hospitalizations.last.year.

> df
      patient.id hospitalization.date hospitalizations.last.year
    1          1           2013-10-15                          1
    2          2           2014-10-15                          1
    3          1           2015-07-16                          1
    4          2           2015-12-20                          1
    5          2           2015-12-25                          2
    6          1           2016-01-07                          2
    7          2           2016-02-10                          3

Обратите внимание, что счетчик включает количество предыдущих записей за последние 365 дней, а не только за текущий год.

Я пытаюсь сделать это, используя dplyr или data.table, потому что мой набор данных огромен, а производительность имеет значение. Является ли это возможным?


  • Согласно этой логике, не следует ли и третье наблюдение считать «госпитализацией в прошлом году»? 22.02.2016
  • Я пытаюсь вычислить третий столбец hospitalizations.last.year для каждого пациента. Итак, для шестого ряда пациент 2 был госпитализирован 2 раза после 25-12-2014, один раз в 25-12-2015 и 20-12-2015. Другой в 2014-10-15 находится вне окна 365 дней. 22.02.2016
  • Мне пока непонятно, извините. Просто для проверки: для каждого наблюдения вы хотите подсчитать количество госпитализаций, произошедших за 365 дней до этой госпитализации. (Спасибо @docendodiscimus) 22.02.2016
  • Да, вы поняли. Это моя проблема. Спасибо. 22.02.2016
  • Похоже на стандартную проблему скользящего соединения, но ваш последний столбец не имеет для меня смысла. Почему, например. текущая дата госпитализации не учитывается в первой строке, но учитывается в последней..? 22.02.2016
  • Извини. Последний столбец был неправильным. hospitalizations.last.year теперь подсчитывает, сколько раз patient.id был в больнице за последний год. 23.02.2016
  • Посмотрите в здесь для вдохновения, похоже, что-то, что должно вам помочь 17.01.2017

Ответы:


1

Начиная с версии 1.9.8 (от CRAN 25 ноября 2016 г.) data.table предлагает неэквивалентные соединения:

library(data.table)
# coerce to data.table
setDT(df)[
  # create helper column
  , date_365 := hospitalization.date - 365][
    # step1: non-equi self-join
    df, on = c("patient.id", "hospitalization.date>=date_365", 
               "hospitalization.date<=hospitalization.date")][
      # step 2: count hospitalizations.last.year for each patient
      , .(hospitalizations.last.year = .N), 
      by = .(patient.id, hospitalization.date = hospitalization.date.1)]
   patient.id hospitalization.date hospitalizations.last.year
1:          1           2013-10-15                          1
2:          2           2014-10-15                          1
3:          1           2015-07-16                          1
4:          2           2015-12-20                          1
5:          2           2015-12-25                          2
6:          1           2016-01-07                          2
7:          2           2016-02-10                          3

Редактировать. Объединение и агрегирование можно объединить в один шаг:

# coerce to data.table
setDT(df)[
  # create helper column
  , date_365 := hospitalization.date - 365][
    # non-equi self-join
    df, on = c("patient.id", "hospitalization.date>=date_365", 
               "hospitalization.date<=hospitalization.date"), 
    # count hospitalizations.last.year grouped by join parameters
    .(hospitalizations.last.year = .N), by = .EACHI][
      # remove duplicate column
      , hospitalization.date := NULL][]

Результат такой же, как указано выше.

Данные

ОП предоставил два набора данных с 6 и 7 строками, соответственно. Здесь используется набор данных с 7 строками, поскольку он был опубликован как ожидаемый результат:

df <- data.frame(
  patient.id = c(1L, 2L, 1L, 1L, 2L, 2L, 2L),
  hospitalization.date = as.Date(c("2013/10/15", "2014/10/15", "2015/7/16", 
                                   "2016/1/7", "2015/12/20", "2015/12/25", "2016/2/10")))
df <- df[order(df$hospitalization.date), ]
20.08.2017
Новые материалы

Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

Игра в прятки с данными
Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

«Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

Все о кейсах: Camel, Snake, Kebab & Pascal
В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..