R数据表-连接方程式上的两个表

R数据表-连接方程式上的两个表,r,data.table,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_pre

是否有一种方法可以使用带有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

我们从“r”中删除第一行(
tail(r,-1)
),并在将1添加到“ymd”后删除最后一行的“r”上加入

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

我们从“r”中删除第一行(
tail(r,-1)
),并在将1添加到“ymd”后删除最后一行的“r”上加入

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

实际上,您正在创建一个滞后变量。要实现这一点,无需执行联接。在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
通过添加
[!is.NA(val_prev_day)]
如下所示,可以删除
val_prev_day
具有
NA
-值的行:

r[, val_prev_day := shift(val)][!is.na(val_prev_day)]
其中:

        ymd val val_prev_day
1: 20151102   2            1
2: 20151103   3            2

实际上,您正在创建一个滞后变量。要实现这一点,无需执行联接。在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
通过添加
[!is.NA(val_prev_day)]
如下所示,可以删除
val_prev_day
具有
NA
-值的行:

r[, val_prev_day := shift(val)][!is.na(val_prev_day)]
其中:

        ymd val val_prev_day
1: 20151102   2            1
2: 20151103   3            2