【问题标题】:How do I match entries in one data table to another by time series?如何按时间序列将一个数据表中的条目与另一个数据表匹配?
【发布时间】:2015-08-05 01:44:38
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: r merge time-series data.table


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多