R数据表 - 在等式上连接两个表

时间:2015-12-17 18:16:25

标签: r data.table

有没有办法使用带有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

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'。

添加1之后删除了最后一行
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