data.table左连接范围

时间:2015-08-06 13:26:33

标签: sql r join data.table between

我正在寻找进行以下连接的“data.table方式”。使用sqldf连接很好,但对我来说似乎相当慢。我想知道是否有更快的解决方案使用data.table(或可能是其他东西,但在R中)。

`

sqldf("
  select a.*, 
  b.c from table1 as a 
  left join table2 as b
  on a.id=b.id
  and a.date >= b.date
  and a.date <= b.enddate;
")

`

table1看起来像这样: `

id  date    a   b
100 1/31/1986   0.02    16100.02
100 2/28/1986   -0.26   11960.00
100 3/31/1986   0.37    16330.00
100 4/30/1986   -0.10   15172.00
100 5/30/1986   -0.22   11793.86
100 6/30/1986   -0.01   11734.59
100 7/31/1986   -0.08   10786.34
100 8/29/1986   -0.62   4148.59
100 9/30/1986   -0.06   3911.53
100 10/31/1986  -0.24   3002.34
100 11/28/1986  0.06    3182.48
100 12/31/1986  -0.38   1981.55
100 1/30/1987   -0.21   1581.53
100 2/27/1987   0.00    1581.53
100 3/31/1987   -0.38   973.25
100 4/30/1987   -0.06   912.42
100 5/29/1987   -0.07   851.59
100 6/30/1987   0.00    NA

`

表2: `

c   id  date    ndate
0   100 2/28/1986   2/28/1987
0.418   100 2/28/1987   2/28/1988

`

1 个答案:

答案 0 :(得分:0)

使用dplyr包。它具有left_join()功能。 要使用它来获得您想要的加入,我认为您可以进行完整加入,然后过滤以删除那些不符合您标准的加入。你只需要考虑它与SQL中的不同,因为你不能一次完成所有这些:

left_join(table1, table2, by("id" = "id")) %>%
    filter(x.date < y.date & x.date > enddate) 

filter也来自dplyr包。

%>%来自magrittr包。

在连接期间,函数将使用x或y为重复的字段名称添加前缀,以表示它来自哪个连接,并避免重复名称。