簡體   English   中英

R問題使用數據幀為缺失的行添加NA值

[英]R Issue adding NA values for missing rows using data frames

在此先感謝您提供的任何幫助。

長話短說:我正在使用來自測量設備的每小時時間序列數據(從SQL導出,然后導入R以正確格式化日期時間)-時間序列包含丟失的數據,有時成組出現,我需要找到這些丟失的行/索引,並為每個包含NA值的實例插入新行。

無法解決我的問題的相關問題:

如何在數據框上插入缺失的觀測值

向缺少值的數據框添加行

問題數據

在這種情況下,我正在使用的數據集非常大,並且取決於我選擇的測量設備。 作為一個測試案例,我有一個時間序列,其中包含每小時17469次觀測。 我找到了可用於測試目的的數據集的一小部分。 這里是:

> snip
                   date Reading
408 2015-12-15 00:00:00    4.40
409 2015-12-14 23:00:00    4.62
410 2015-12-14 22:00:00    4.61
411 2015-12-14 21:00:00    6.15
412 2015-12-14 20:00:00    6.06
413 2015-12-14 19:00:00    7.04
414 2015-12-14 18:00:00    8.57
415 2015-12-14 11:00:00    4.12
416 2015-12-14 10:00:00    3.73

我們可以看到2015年12月14日12:00:00至2015-12-14 17:00:00的觀測值缺失。 我想先定位,然后使用這些日期時間填充時間序列,並在這些位置的“閱讀”列中輸入NA 我還想返回附加向量中缺少的索引。

如何才能做到這一點?

到目前為止,我已經嘗試了以下代碼(如此處所建議的, 如何添加缺失的日期並刪除每小時時間序列中的重復日期 ),但是當執行merge功能時,我最終得到的是NA值,仍然需要確定在哪里找不到索引。

結果如下:

> grid = data.frame(date=seq.POSIXt(min(snip[,1]), to=max(snip[,1]), by="1 hours"));
> dat = merge(grid, snip, by="date", all.x=TRUE)
> dat
                  date Reading
1  2015-12-14 10:00:00      NA
2  2015-12-14 11:00:00      NA
3  2015-12-14 12:00:00      NA
4  2015-12-14 13:00:00      NA
5  2015-12-14 14:00:00      NA
6  2015-12-14 15:00:00      NA
7  2015-12-14 16:00:00      NA
8  2015-12-14 17:00:00      NA
9  2015-12-14 18:00:00      NA
10 2015-12-14 19:00:00      NA
11 2015-12-14 20:00:00      NA
12 2015-12-14 21:00:00      NA
13 2015-12-14 22:00:00      NA
14 2015-12-14 23:00:00      NA
15 2015-12-15 00:00:00      NA

我在這里想念什么? 是因為gridsnip$date是相反的順序嗎? 有關其他信息,以下是日期時間格式(如果這是我的問題的出處):

> snip[2,1]
[1] "2015-12-14 23:00:00 GMT"

dput(snip)命令的結果如下(感謝@ 42的建議):

> dput(snip)
structure(list(date = structure(list(sec = c(0, 0, 0, 0, 0, 0, 
0, 0, 0), min = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), hour = c(0L, 
23L, 22L, 21L, 20L, 19L, 18L, 11L, 10L), mday = c(15L, 14L, 14L, 
14L, 14L, 14L, 14L, 14L, 14L), mon = c(11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L), year = c(115L, 115L, 115L, 115L, 115L, 115L, 
115L, 115L, 115L), wday = c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), yday = c(348L, 347L, 347L, 347L, 347L, 347L, 347L, 347L, 347L
), isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"), tzone = "GMT"), Reading = c(4.4, 
4.62, 4.61, 6.15, 6.06, 7.04, 8.57, 4.12, 3.73)), .Names = c("date", 
"Reading"), row.names = 408:416, class = "data.frame")

在na.locf文檔中提供了一些幫助的情況下,這就是我的方法。 有幫助嗎?

dat<- dget("yoursample")
require(xts)
datxts<- as.xts(dat[,-1],order.by = dat$date,frequency = 24)
tzn<-tzone(datxts)
g<- seq(start(datxts), end(datxts), "hour")
gxts<- xts(rep(NA,length(g)),order.by = as.POSIXct(g), tzone = tzn)

merge(datxts,gxts,all = T)$datxts

編輯:而且,如果將NA的列添加到生成的數據幀中,則您的方法也有效

dates=seq.POSIXt(min(snip[,1]), to=max(snip[,1]), by="1 hours")
grid = data.frame(date=dates,dummydata=rep(NA,length(dates)));
dat = merge(grid, snip, by="date", all=T)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM