我正在作業,R我有一些時間序列資料,其中相關時間是一個日期范圍——即,每一行都有一個開始日期和一個結束日期,并且記錄指定了該時期的結果。我希望能夠以適當的方式表示此物件R并將其與具有特定日期的其他時間序列合并。在合并的情況下,我希望我的第一個時間序列(使用日期范圍的記錄)中的每條記錄與該范圍內的日期相匹配,在有兩個或范圍內的更具體日期。這是我希望使用模擬資料執行的操作的簡單示例:
#Time series with a date-range
TIME.SERIES1
Start End Value
2018-01-01 2018-01-31 80.6
2018-02-01 2018-02-12 140.5
2018-02-13 2018-05-03 122.1
2018-05-04 2018-05-14 108.5
2018-05-15 2018-05-31 96.0
2018-06-01 2018-06-30 103.3
#Time series using specific dates
TIME.SERIES2
Date Staff
2018-01-15 551
2018-02-14 606
2018-05-18 640
2018-06-02 635
2018-07-15 633
#Merge these using left-join of TIME.SERIES1 and TIME.SERIES2
[some merge command]
Start End Value Staff
2018-01-01 2018-01-31 80.6 551
2018-02-01 2018-02-12 140.5 NA
2018-02-13 2018-05-03 122.1 606
2018-05-04 2018-05-14 108.5 NA
2018-05-15 2018-05-31 96.0 640
2018-06-01 2018-06-30 103.3 635
我知道你可以很容易地SQL在R. 之前用過這個xls包進行時間序列分析,不知道能不能完成我想做的事情。這個包似乎允許我指定一個日期作為索引,而不是一個日期范圍。同樣,它似乎允許我在單個日期合并兩個時間序列物件,但我不確定如何根據日期范圍進行合并(以上面顯示的方式)。
問題:時間序列設施能否R處理時間索引是日期范圍而不是特定日期的物件(即,您是否可以有一個由開始時間和結束時間組成的索引)?我們如何將具有日期范圍的資料與具有單個日期的日期合并?
uj5u.com熱心網友回復:
由于期間總是完整的單月,并假設輸入是最后的 Note 中顯示的資料框,我們假設所有日期都屬于 Date 類,因此向兩者添加 yearmon 類列并加入該列。
library(zoo)
ts1$ym <- as.yearmon(ts1$Start)
ts2$ym <- as.yearmon(ts2$Date)
library(dplyr)
left_join(ts1, ts2, "ym")
給予:
Start End Value ym Date Staff
1 2018-01-01 2018-01-31 80.6 Jan 2018 2018-01-15 551
2 2018-02-01 2018-02-28 140.5 Feb 2018 2018-02-14 606
3 2018-03-01 2018-03-31 122.1 Mar 2018 <NA> NA
4 2018-04-01 2018-04-30 108.5 Apr 2018 <NA> NA
5 2018-05-01 2018-05-31 96.0 May 2018 2018-05-18 640
6 2018-06-01 2018-06-30 103.3 Jun 2018 2018-06-02 635
筆記
TIME.SERIES1
Lines1 <- "
Start End Value
2018-01-01 2018-01-31 80.6
2018-02-01 2018-02-28 140.5
2018-03-01 2018-03-31 122.1
2018-04-01 2018-04-30 108.5
2018-05-01 2018-05-31 96.0
2018-06-01 2018-06-30 103.3"
ts1 <- transform(read.table(text = Lines1, header = TRUE),
Start = as.Date(Start), End = as.Date(End))
Lines2 <- "
Date Staff
2018-01-15 551
2018-02-14 606
2018-05-18 640
2018-06-02 635
2018-07-15 633"
ts2 <- transform(read.table(text = Lines2, header = TRUE),
Date = as.Date(Date))
uj5u.com熱心網友回復:
一種想法是創建笛卡爾積,然后應用過濾器以僅保留有效案例。這種方法的好處是您可以對資料使用通常的操作(分組、變異、過濾),這為解決關系的方法帶來了靈活性。
感謝 G. Grothendieck 提供從問題中創建資料集的代碼。
library(tidyverse)
library(lubridate)
# See G. Grothendieck's answer for ts1 and ts2
value = tibble(ts1)
staff = tibble(ts2)
full_join(value, staff, by = character()) %>%
mutate(valid = Date %within% interval(Start, End)) %>%
group_by(Start, End, Value) %>%
arrange(Date) %>%
summarise(Staff = Staff[valid][1])
輸出
Start End Value Staff
<date> <date> <dbl> <int>
1 2018-01-01 2018-01-31 80.6 551
2 2018-02-01 2018-02-28 140. 606
3 2018-03-01 2018-03-31 122. NA
4 2018-04-01 2018-04-30 108. NA
5 2018-05-01 2018-05-31 96 640
6 2018-06-01 2018-06-30 103. 635
請注意,在此解決方案中,我使用了Staff該范圍內的最早值。您可以輕松更改此設定以滿足您的要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/386960.html
