我有一個非常大的資料集,日期和時間在與資料對應的 15 分鐘間隔的單列中。不幸的是,記錄資料的軟體有一些問題,所以隨機有 15 分鐘的間隔(通常是 1 或 2,但有時是 3 和 4)。資料集報告如下:
Date_and_time Pressure
2016-07-08 18:00:00 3.542
2016-07-08 18:15:00 5:444
2016-07-08 18:45:00 2:556
2016-07-08 19:00:00 4:567
我正在尋找一種在缺失的時間范圍之間輸入一行的方法。我的目標是將多個站點的這些資料堆疊在一起,我和我需要確保為了繪圖目的而排列。
uj5u.com熱心網友回復:
如果你能完美地保證所有時間都在刻鐘上對齊,那么你可以試試這個:
tibble(Date_and_time = do.call(seq, c(as.list(range(dat$Date_and_time)), by="15 mins"))) %>%
full_join(dat, by = "Date_and_time")
# # A tibble: 5 x 2
# Date_and_time Pressure
# <dttm> <chr>
# 1 2016-07-08 18:00:00 3.542
# 2 2016-07-08 18:15:00 5:444
# 3 2016-07-08 18:30:00 <NA>
# 4 2016-07-08 18:45:00 2:556
# 5 2016-07-08 19:00:00 4:567
如果您認為您的時間有可能沒有完全對齊(即使是幾分之一秒也會引入不必要的行),那么我們可以將其轉化為“強制間隔不超過 15 分鐘”的問題:
dat %>%
group_by(grp = cumsum(c(FALSE, as.numeric(diff(Date_and_time), units = "mins") > 15))) %>%
summarize(Date_and_time = max(Date_and_time) 15*60) %>%
bind_rows(dat) %>%
arrange(Date_and_time) %>%
select(-grp)
# # A tibble: 6 x 2
# Date_and_time Pressure
# <dttm> <chr>
# 1 2016-07-08 18:00:00 3.542
# 2 2016-07-08 18:15:00 5:444
# 3 2016-07-08 18:30:00 <NA>
# 4 2016-07-08 18:45:00 2:556
# 5 2016-07-08 19:00:00 4:567
# 6 2016-07-08 19:15:00 <NA>
請注意,最后添加的行是不必要的,可以通過簡單的清理步驟將其洗掉。第二種方法的前提是它創建一個組,其中組內的所有內容都間隔 15 分鐘(或更少),然后在最后一行添加 15 分鐘。這確保沒有超過 15 分鐘的間隔,但是:
- 它總是會在底部生成可能不需要的單行;和
- 它不保證添加的行與其下方的行之間的間隙。例如,如果您的第三行改為在
"2016-07-08 18:31:00",則時間將按"18:15:00","18:30:00", 然后"18:31:00"(間隔 1 分鐘)進行排序。
資料
dat <- structure(list(Date_and_time = structure(c(1468015200, 1468016100, 1468017900, 1468018800), class = c("POSIXct", "POSIXt"), tzone = ""), Pressure = c("3.542", "5:444", "2:556", "4:567")), row.names = c(NA, -4L), class = "data.frame")
uj5u.com熱心網友回復:
您可以制作一個具有所有潛在采樣時間的序列,然后將您的資料加入其中。
library(tidyverse)
ALL_PERIODS <-data.frame(SAMPLE_TIME= seq.POSIXt(from = as.POSIXlt("2016-07-08 18:00:00"), to =as.POSIXlt("2016-07-08 20:00:00"), by = "15 min"))
SAMPLE_DATA <- data.frame(Date_and_time= as.POSIXlt( c("2016-07-08 18:00:00","2016-07-08 18:15:00","2016-07-08 18:45:00","2016-07-08 19:00:00") ), pressure=c(3.542, 5.444,2.556, 4.567))
ALL_PERIODS_DATA <- left_join(ALL_PERIODS,SAMPLE_DATA, by=c("SAMPLE_TIME"="Date_and_time"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313657.html
下一篇:不同時期的不一致索引只有一種型別
