Заполнение пропусков (пробелов) в таблице данных, по категориям - назад и вперед

Я работаю с большим набором данныхbilling records for my clinical practice over 11 years, В нескольких строках отсутствует лечащий врач. Однако, используя некоторые правила, я могу довольно легко их заполнить, но не знаю, как реализовать их в data.table под R. Я знаю, что есть такие вещи, какna.locf в пакете zoo и самообслуживание объединяются в пакет data.table. Примеры, которые я видел, слишком упрощены и не помогают мне.

Вот некоторые вымышленные данные, чтобы ориентировать вас (как текстовое представление dput ASCII)

    structure(list(patient.first.name = structure(c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("John", "Kathy", 
"Timothy"), class = "factor"), patient.last.name = structure(c(3L, 
3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Jones", 
"Martinez", "Squeal"), class = "factor"), medical.record.nr = c(4563455, 
4563455, 4563455, 4563455, 4563455, 2663775, 2663775, 2663775, 
2663775, 2663775, 3330956, 3330956, 3330956, 3330956), date.of.service = c(39087, 
39112, 39112, 39130, 39228, 39234, 39244, 39244, 39262, 39360, 
39184, 39194, 39198, 39216), procedure.code = c(44750, 38995, 
40125, 44720, 44729, 44750, 38995, 40125, 44720, 44729, 44750, 
44729, 44729, 44729), diagnosis.code.1 = c(456.87, 456.87, 456.87, 
456.87, 456.87, 521.37, 521.37, 521.37, 521.37, 356.36, 456.87, 
456.87, 456.87, 456.87), diagnosis.code.2 = c(413, 413, 413, 
413, 413, 532.23, NA, NA, NA, NA, NA, NA, NA, NA), referring.doctor.first = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Abe", 
"Mark"), class = "factor"), referring.doctor.last = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Newstead", 
"Wydell"), class = "factor"), referring.docotor.zip = c(15209, 
15209, 15209, 15209, 15209, 15222, 15222, 15222, NA, NA, NA, 
15209, 15209, NA), some.other.stuff = structure(c(1L, 1L, 1L, 
NA, 3L, NA, NA, 4L, NA, 6L, NA, 2L, 5L, NA), .Label = c("alkjkdkdio", 
"cheerios", "ddddd", "dddddd", "dogs", "lkjljkkkkk"), class = "factor")), .Names = c("patient.first.name", 
"patient.last.name", "medical.record.nr", "date.of.service", 
"procedure.code", "diagnosis.code.1", "diagnosis.code.2", "referring.doctor.first", 
"referring.doctor.last", "referring.docotor.zip", "some.other.stuff"
), row.names = c(NA, 14L), class = "data.frame")

Очевидное решение состоит в том, чтобы использовать какой-то алгоритм переноса последнего наблюдения (LOCF) на referring.doctor.last и referring.doctor.first. Тем не менее, он должен остановиться, когда доберется до нового пациента. Другими словами, LOCF должен применяться только к одному пациенту, который идентифицируется комбинацией Patient.first.name, PatientLast.Name, medical.record.nr. Также обратите внимание на то, что некоторые пациенты пропускают направляющего врача при первом же посещении, поэтому это означает, что некоторые наблюдения необходимо проводитьbackwards, Чтобы усложнить ситуацию, некоторые пациенты меняют врачей первичной медицинской помощи, поэтому может быть один направляющий врач ранее, а другой - позже. Алгоритм, следовательно, должен знать порядок дат строк с пропущенными значениями.

В зоопаркеna.locf Я не вижу простого способа сгруппировать LOCF для каждого пациента. Скользящие примеры объединения, которые я видел, здесь не сработают, потому что я не могу просто извлечь строки с отсутствующей информацией referring.doctor, так как тогда я потеряю date.of.service и protocol.code и так далее. Мне бы очень хотелось, чтобы вы узнали, как R может заполнить мои недостающие данные.

Ответы на вопрос(2)

Ваш ответ на вопрос