【问题标题】:R data table - join two tables on equationR 数据表 - 在方程式上连接两个表
【发布时间】:2015-12-17 18:16:25
【问题描述】:

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


    【解决方案1】:

    您实际上在做的是创建一个滞后变量。为了实现这一点,没有必要进行连接。在 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
    

    【讨论】:

      【解决方案2】:

      我们从 '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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 2013-07-11
        • 2013-08-19
        相关资源
        最近更新 更多