Ich habe eine data.table
mit Zeitreihen von stündlichen Beobachtungen von verschiedenen Standorten (Standorte). Es gibt Lücken - fehlende Stunden - in jeder Sequenz. Ich möchte die Stundenfolge für jeden Standort ausfüllen, so dass jede Sequenz für jede Stunde eine Zeile enthält (obwohl Daten fehlen, NA).Wie machen Sie kontinuierliche Zeitfolgen innerhalb von Gruppen in der data.table?
Beispiel Daten:
library(data.table)
library(lubridate)
DT <- data.table(site = rep(LETTERS[1:2], each = 3),
date = ymd_h(c("2017080101", "2017080103", "2017080105",
"2017080103", "2017080105", "2017080107")),
# x = c(1.1, 1.2, 1.3, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3),
x = c(1.1, 1.2, 1.3, 2.1, 2.2, 2.3),
key = c("site", "date"))
DT
# site date x
# 1: A 2017-08-01 01:00:00 1.1
# 2: A 2017-08-01 03:00:00 1.2
# 3: A 2017-08-01 05:00:00 1.3
# 4: B 2017-08-01 03:00:00 2.1
# 5: B 2017-08-01 05:00:00 2.2
# 6: B 2017-08-01 07:00:00 2.3
Das gewünschte Ergebnis DT2
alle Stunden enthalten würde zwischen dem ersten (Minimum) Datum und die letzte (maximal) Datum für jeden Standort, mit x fehlt, wo die neuen Zeilen eingefügt :
# site date x
# 1: A 2017-08-01 01:00:00 1.1
# 2: A 2017-08-01 02:00:00 NA
# 3: A 2017-08-01 03:00:00 1.2
# 4: A 2017-08-01 04:00:00 NA
# 5: A 2017-08-01 05:00:00 1.3
# 6: B 2017-08-01 03:00:00 2.1
# 7: B 2017-08-01 04:00:00 NA
# 8: B 2017-08-01 05:00:00 2.2
# 9: B 2017-08-01 06:00:00 NA
#10: B 2017-08-01 07:00:00 2.3
ich habe versucht, DT
mit einem Datum Reihenfolge von min(date)
und max(date)
aufgebaut zu verbinden. Dies ist in der richtigen Richtung, aber der Datumsbereich ist über alle Standorte, anstatt für jede einzelne Website, die in Reihen hat fehlende Stelle gefüllt, und die Sortierreihenfolge (key) ist falsch:
DT[.(seq(from = min(date), to = max(date), by = "hour")),
.SD, on="date"]
# site date x
# 1: A 2017-08-01 01:00:00 1.1
# 2: NA 2017-08-01 02:00:00 NA
# 3: A 2017-08-01 03:00:00 1.2
# 4: B 2017-08-01 03:00:00 2.1
# 5: NA 2017-08-01 04:00:00 NA
# 6: A 2017-08-01 05:00:00 1.3
# 7: B 2017-08-01 05:00:00 2.2
# 8: NA 2017-08-01 06:00:00 NA
# 9: B 2017-08-01 07:00:00 2.3
So natürlich ich versuchte Hinzufügen by = site
:
DT[.(seq(from = min(date), to = max(date), by = "hour")),
.SD, on="date", by=.(site)]
# site date x
# 1: A 2017-08-01 01:00:00 1.1
# 2: A 2017-08-01 03:00:00 1.2
# 3: A 2017-08-01 05:00:00 1.3
# 4: NA <NA> NA
# 5: B 2017-08-01 03:00:00 2.1
# 6: B 2017-08-01 05:00:00 2.2
# 7: B 2017-08-01 07:00:00 2.3
Aber das funktioniert auch nicht. Kann jemand die richtige data.table
Formulierung vorschlagen, um das gewünschte ausgefüllte DT2
oben gezeigt zu geben?
Warum es nicht funktioniert: 'DT [i, j, von]' gelesen wird "Filter von' i'; Gruppe von 'by'; dann tun' j'. " Sie versuchen, gruppierte Operationen in "i" zu machen. – Frank
Danke @Frank. Ich kann jetzt sehen, dass ich die 'seq()' in 'j' setzen musste und dann das resultierende' DT' in 'i' verwende. –