2016-05-06 11 views
2

Ich habe einen Datensatz mit Beobachtungen von mehreren Patienten und deren Diagnosen im Laufe der Zeit. Es gibt 9 verschiedene Dummy-Variablen, von denen jede eine spezifische Diagnose darstellt, die z.B. L40, L41, K50, M05 und so weiter.Letzte Beobachtung von der Gruppe über mehrere Spalten

Wenn in den Dummy-Variablen fehlende Werte vorhanden sind, möchte ich den letzten nicht fehlenden Wert nach Patient übertragen, so dass nach der Diagnose eines Patienten die nachfolgenden Beobachtungen durchlaufen werden.

Ich begann damit und nutzte die na.locf-Funktion aus dem Zoo-Paket.

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] 

Dies erreicht, was ich suche, aber nur auf der fraglichen Spalte (L40). Gibt es eine Möglichkeit, das Obige auf alle relevanten Diagnose-Spalten anzuwenden, d. H. Spalten, die mit K, L und M beginnen?

+0

Verwenden Sie 'setDT' oder' as.data.table' anstelle von 'data.table()', um von 'dat.frame' an Stelle oder als Kopie zu konvertieren – eddi

Antwort

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

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

Werfen Sie auch einen Blick auf efficiently locf by groups in a single R data.table.

+0

Ist keine na.locf-Alternative implementiert? nur mit data.table Funktionen? – skan

+0

die Rolle = T, Inf, -Inf soll das gleiche tun –

+1

@MM der Locf in rollenden Joins, passiert ** während Joins **. Es ist möglich, dies in ein Join-Problem umzuwandeln, aber das ist keine effektive Verwendung von R. – eddi