2015-05-22 55 views
1

我想在R中合併兩個時間序列數據表,但希望將一個數據表的條目合併到之前數據框中的條目之前。如何通過時間序列將一個數據表中的條目與另一個數據表中的條目進行匹配?

這樣做的一個例子是嘗試將位置數據與購買數據進行匹配,以找出人們進行每次購買的位置。我已經創建了兩個示例數據集來說明這一點。人們對每個位置變化都有一個觀察,其中包括位置變化的日期和人員的身份。人們對每次購買有一個觀察,其中包括購買日期和該人的身份。我想要的是將兩者合併,以便我知道在每次購買之前最近的位置更改是什麼,以便我可以找出發生購買的地方。

創建示例數據集:

require(data.table) 
df.loc = data.frame(date.loc = sample(seq(as.Date("2010-01-01"), by=1, length.out=50),50), ID = rep(letters[seq(1:5)],10)) 

df.pur = data.frame(date.pur = sample(seq(as.Date("2010-01-01"), by=1, length.out=50),50), ID = rep(letters[seq(1:5)],10)) 

#convert to a data.table for later analysis 
dt.loc = as.data.table(df.loc) 
dt.pur = as.data.table(df.pur) 

的樣本數據例如:

head(dt.loc) 

date.loc ID 
2010-01-14 a 
2010-01-19 b 
2010-01-28 c 
2010-02-12 d 
2010-01-10 e 
2010-02-10 a 

謝謝!

回答

2

這可以使用data.table的滾動連接功能來完成。實質上,這將使購物數據表中的ID的每個觀察值與緊接在其之前的該ID的位置數據表中的觀察值匹配。如果該組中的第一個條目是購買,那麼我會假定緊接着它的ID的位置條目將被使用。

#load required packages 
require(data.table) 
require(zoo) 

#add a rolling date columns to the location datatable 
dt.loc[, rollDate := date.loc] 

#rename the purchase column date to rollDate to allow for a merge 
setnames(dt.pur,"date.pur","rollDate") 

#set keys, ordering the dataframe by ID and then date 
keys_rate = c("ID", "rollDate") 
keys_bill = c("ID", "rollDate") 
setkeyv(dt.loc, keys_loc) 
setkeyv(dt.pur, keys_pur) 

#Rolling merge, finding the location observation immediately prior to the purchase observatoin 
dt.merge = dt.loc[dt.pur, roll=TRUE] 

#Fix the NAs, by assuming that if a purchase observation has no rate observations before it, it uses the location immediately after it 
dt.merge[, date.loc := na.locf(date.loc, fromLast=TRUE)] 

(回答這個我自己,因爲我最後一次看有計算器上沒有解釋這一點,我可以用它!)

Here is a good explanation of rolling joins in data.table more generally.

相關問題