Wypełnianie brakujących (pustych miejsc) w tabeli danych, według kategorii - do tyłu i do przodu

Pracuję z dużym zestawem danychzapisy rozliczeniowe dla mojej praktyki klinicznej ponad 11 lat. W wielu rzędach brakuje lekarza kierującego. Jednak używając pewnych reguł mogę całkiem łatwo je wypełnić, ale nie wiem, jak je zaimplementować w pliku data.table pod R. Wiem, że są takie rzeczy, jakna.locf w pakiecie zoo i samodzielne łączenie w pakiecie data.table. Przykłady, które widziałem, są zbyt uproszczone i nie pomagają mi.

Oto kilka fikcyjnych danych, które mogą Cię zorientować (jako reprezentacja tekstu ASCII w Dput)

    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")

Oczywistym rozwiązaniem jest użycie pewnego rodzaju algorytmu ostatniej obserwacji (LOCF) na poleceniu referenring.doctor.last i referring.doctor.first. Musi się jednak zatrzymać, gdy dotrze do nowego pacjenta. Innymi słowy, LOCF musi być stosowany tylko do jednego pacjenta, który jest identyfikowany przez kombinację pacjenta.nazwa_pierwsza, pacjent.nazwa.nazwa, medyczny.record.nr. Zwróć także uwagę, jak niektórzy pacjenci tęsknią za lekarzem kierującym podczas pierwszej wizyty, co oznacza, że ​​należy przeprowadzić pewne obserwacjewstecz. Aby skomplikować sprawy, niektórzy pacjenci zmieniają lekarzy podstawowej opieki zdrowotnej i dlatego może być wcześniej jeden lekarz kierujący, a drugi później. Alogorytm musi zatem znać kolejność dat wierszy z brakującymi wartościami.

W zoona.locf Nie widzę łatwego sposobu grupowania LOCF na pacjenta. Toczące się przykłady połączeń, które widziałem, nie zadziałałyby tutaj, ponieważ nie mogę po prostu usunąć wierszy z brakującymi informacjami referencyjnymi, ponieważ straciłbym wtedy date.of.service i procedure.code etcetera. Bardzo chciałbym pomóc w nauce, jak R może wypełnić moje brakujące dane.

questionAnswers(2)

yourAnswerToTheQuestion