Допуск в здание — Сравнение перекрестных записей — данные.таблица

#r #data.table

#r #данные.таблица

Вопрос:

Я новичок в R и data.table, и мой мозг настроен на мышление в SAS, поэтому я ищу подходы к следующей проблеме.

У меня есть счета за медицинское обслуживание, которые охватывают период времени «от» до «через». Я хочу создать пропуски, где я отмечаю все счета, которые являются непрерывными (т. Е. между ними не более суток). В приведенном ниже примере данных столбцы «пациент», «от» и «через» — это то, с чего мы начинаем, а столбец «Принять» — это то, что я хочу добавить.

 Name    From    Thru    Admit
John    1/1/18  1/7/18  1
John    1/8/18  1/15/18 1
John    1/18/18 1/20/18 2
Jane    1/1/18  1/3/18  3
Jane    1/5/18  1/8/18  4
Jane    1/10/18 1/17/18 5
Jane    1/12/18 1/17/18 5
Jane    1/18/18 1/24/18 5
Frank   2/1/18  2/1/18  6
Frank   2/1/18  2/10/18 6
Frank   2/3/18  2/3/18  6
Frank   2/4/18  2/4/18  6
Frank   2/5/18  2/5/18  6
  

Я бы предпочел решение, ориентированное на данные.таблица. Мне нужна какая-то подсказка — в SAS я точно знаю, как это сделать, но я пытаюсь узнать что-то новое.

Спасибо.

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

1. Вам нужно будет использовать формат даты (см. ?Date или ?IDate ), тогда, возможно, можно было бы сделать что-то вроде DT[, g := .GRP, by=.(Name, cumsum(From - shift(Thru) > 1))]

2. код @josemz по-прежнему выдает столбец Admit выше, верно? Может быть, если вы удалите предпоследнюю строку ..?

Ответ №1:

Следуя комментарию Фрэнка, если ваш data.table вызывается DT :

 date_cols <- c("From", "Thru")
DT[, (date_cols) := lapply(.SD, as.Date, format = "%m/%d/%y"), .SDcols = date_cols]
DT[, Admit := 1   cumsum(From - shift(Thru, fill = Thru[1]) > 1 | 
                         Name != shift(Name, fill = Name[1]))]
DT

#    Name       From       Thru Admit
# 1: John 2018-01-01 2018-01-07     1
# 2: John 2018-01-08 2018-01-05     1
# 3: John 2018-01-18 2018-01-20     2
# 4: Jane 2018-01-01 2018-01-03     3
# 5: Jane 2018-01-05 2018-01-08     4
# 6: Jane 2018-01-10 2018-01-17     5
# 7: Jane 2018-01-12 2018-01-17     5
# 8: Jane 2018-01-18 2018-01-24     5
  

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

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

1. Очень умный и близкий. Это дало мне материал для работы. Все еще застрял с сравнением перекрестных записей для Фрэнка. Каким-то образом нам нужно запомнить дату от 2/10 до конца для переменного числа последующих записей.

2. Я думаю, это расширение работает для нового примера: DT[, g := 1L cumsum( From - shift(cummax(as.integer(Thru)), fill = Thru[1]) > 1 ), by=Name][, g := .GRP, by=.(Name,g)][] (Не стесняйтесь редактировать его в)

3. Да — это решает проблему. Не уверен, как отдать вам «должное» за решение.