#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. Да — это решает проблему. Не уверен, как отдать вам «должное» за решение.