如何按时间序列匹配一个数据表中的条目?

时间:2015-05-22 22:32:49

标签: r merge time-series data.table

我想在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

谢谢!

1 个答案:

答案 0 :(得分:3)

这可以使用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)]

(自己回答这个问题,因为我上次看到那里没有关于stackoverflow的解释,我可以使用它!)

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

相关问题