[英]time series in r: how to merge two dataframes by two keys, but only generating one column
[英]How do I merge two time series to result in an object with only the dates from the smaller one (R)?
我有兩個每日時間序列,范圍從2016年1月1日到2016年8月1日,但是我的一個序列僅包含工作日(即,不包括周末和銀行假日)的數據,另一個包含每天的數據。 我的問題是,如何合並兩個系列,以便在兩個時間序列中只剩下營業日數據(從第二個時間序列中刪除多余的日期)
這個問題也用data.table
標記,所以我猜這兩個時間序列存儲為data.frames或data.tables。
默認情況下, data.table
中的聯接是右聯接 。 因此,如果您提前知道“較短”時間序列中的哪個序列,則可以編寫:
library(data.table)
dt_long[dt_short, on = "date"]
# date weekday i.weekday
#1: 2017-03-30 4 4
#2: 2017-03-31 5 5
#3: 2017-04-03 1 1
#4: 2017-04-04 2 2
#5: 2017-04-05 3 3
#6: 2017-04-06 4 4
如果不確定哪個“較短”時間序列是可以使用內部聯接 :
dt_short[dt_long, on = "date", nomatch = 0]
nomatch = 0
指定內部nomatch = 0
。
如果您的時間序列還不是data.tables作為此處的樣本數據,而是存儲為data.frames,則需要通過以下方式將它們強制轉換為data.table
類:
setDT(dt_long)
setDT(dt_short)
由於OP沒有提供任何可復制的數據,因此我們需要自行准備示例數據(類似於此答案,但作為data.table
):
library(data.table)
dt_long <- data.table(date = as.Date("2017-03-30") + 0:7)
# add payload: integer weekday according ISO (week starts on Monday == 1L)
dt_long[, weekday := as.integer(format(date, "%u"))]
# remove weekends
dt_short <- dt_long[weekday < 6L]
我們有兩個包含周末的data.frame df_long
和不包含周末的df_short
Date <- as.Date(seq(as.Date("2003-03-03"), as.Date("2003-03-17"), by = 1), format="%Y-%m-%d")
weekday <- weekdays(as.Date(Date))
df_long <- data.frame(Date, weekday)
df_short<- df_long[ c(1:5, 8:12, 15), ]
您可以使用加入他們dplyr::inner_join
從刪除周末和節假日df_long
並只保留工作日。
library(dplyr)
df_join <- df_long %>% inner_join(., df_short, by ="Date")
> df_join
Date weekday.x weekday.y
1 2003-03-03 Monday Monday
2 2003-03-04 Tuesday Tuesday
3 2003-03-05 Wednesday Wednesday
4 2003-03-06 Thursday Thursday
5 2003-03-07 Friday Friday
6 2003-03-10 Monday Monday
7 2003-03-11 Tuesday Tuesday
8 2003-03-12 Wednesday Wednesday
9 2003-03-13 Thursday Thursday
10 2003-03-14 Friday Friday
11 2003-03-17 Monday Monday
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.