我有一個data.table
包含來自不同位置(站點)的小時觀測的時間序列。在每個序列中都有缺口 - 缺少小時。我想填寫每個站點的小時序列,因此每個小時都有一行(儘管數據將丟失,不適用)。如何在data.table中的組內連續創建時間序列?
實施例的數據:
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
期望的結果DT2
將包含所有的第一(最低)日期和每個站點中的最後(最大)日期之間的時間,其中x缺少其中新的行被插入:
# 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
我曾嘗試加入DT
與min(date)
和max(date)
構建一個日期序列。這是在正確的方向,但日期範圍是所有的網站,而不是對每個單獨的站點,換行有缺失的部位,排序順序(密鑰)是錯誤的:
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
所以我很自然嘗試加入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
但是這也行不通。任何人都可以提出正確的data.table
公式來給出所需的填充DT2
如上所示?
重試爲什麼它不起作用:'DT [i,j,by]'被讀取爲「由i過濾」;由'by'過濾;然後做'j'。您正試圖在'i'中進行分組操作。 – Frank
謝謝@Frank。我現在可以看到我需要將'seq()'放入'j'中,然後在'i'中使用生成的'DT'。 –