有没有办法使用带有data.table库的公式连接两个表?
在SQL中,这将是:
r = data.table(ymd=c(20151101, 20151102, 20151103), val=c(1,2,3))
require(sqldf)
sqldf('select t1.*, t2.val as val_prev_day
from r t1
join r t2
on t1.ymd=(t2.ymd+1)
')
ymd val val_prev_day
1 20151102 2 1
2 20151103 3 2
答案 0 :(得分:3)
您实际在做的是创建一个滞后变量。为了实现这一点,没有必要进行连接。在 data.table 中,您可以使用shift
- 函数创建一个滞后变量,如下所示:
r[, val_prev_day := shift(val)]
会给你:
> r
ymd val val_prev_day
1: 20151101 1 NA
2: 20151102 2 1
3: 20151103 3 2
您可以通过添加val_prev_day
来删除NA
具有[!is.na(val_prev_day)]
- 值的行:
r[, val_prev_day := shift(val)][!is.na(val_prev_day)]
给出:
ymd val val_prev_day
1: 20151102 2 1
2: 20151103 3 2
答案 1 :(得分:0)
我们删除了第一行' r' (tail(r, -1)
)并加入on
' r'在向' ymd'。
tail(r,-1)[head(r,-1)[, ymd:=ymd+1],val_prev_day:= i.val ,on = 'ymd'][]
# ymd val val_prev_day
#1: 20151102 2 1
#2: 20151103 3 2
以上内容类似于OP代码中的SQL语法。
或者我们可以使用dplyr
library(dplyr)
setDF(r) %>%
mutate(val_prev_day= lag(val)) %>%
na.omit()
# ymd val val_prev_day
#2 20151102 2 1
#3 20151103 3 2