我正在寻找进行以下连接的“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
`
答案 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为重复的字段名称添加前缀,以表示它来自哪个连接,并避免重复名称。