Последнее наблюдение перенесено группой в несколько столбцов

У меня есть набор данных с наблюдениями за несколькими пациентами и их диагнозами с течением времени. Существует 9 различных фиктивных переменных, каждая из которых представляет конкретный диагноз, например, с именем L40, L41, K50, M05 и так далее.

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

Я начал с этого, используя функцию na.locf из пакета zoo.

diagdata <- originaldata[,grep("^patient|^ar|^edatum|^K|^L|^M",colnames(originaldata))]

require(zoo)
require(data.table)

diagnosis <- data.table(diagdata)

diagnosis[,L40:=na.locf(L40),by=patient]

Этим достигается то, что я ищу, но только в рассматриваемой колонке (L40). Есть ли способ применить вышеизложенное ко всем соответствующим столбцам диагностики, то есть столбцам, начинающимся с K, L и M?


person udden2903    schedule 06.05.2016    source источник
comment
используйте setDT или as.data.table вместо data.table() для преобразования из data.frame на месте или в качестве копии соответственно   -  person eddi    schedule 06.05.2016


Ответы (1)


cols = grep("^K|^L|^M", names(diagnosis), value = T)

diagnosis[, (cols) := na.locf(.SD, na.rm = F), by = patient, .SDcols = cols]

Также ознакомьтесь с эффективным поиском по группам в одном R data.table.

person eddi    schedule 06.05.2016
comment
Нет ли альтернативы na.locf, реализованной только с функциями data.table? - person skan; 25.05.2017
comment
roll = T, Inf, -Inf предположительно делает то же самое - person M M; 17.07.2017
comment
@MM locf в скользящих соединениях, происходит во время соединений. Можно преобразовать это в проблему соединения, но это неэффективное использование R. - person eddi; 17.07.2017