R 窗口(也称为滚动)与data.table连接

R 窗口(也称为滚动)与data.table连接,r,join,data.table,R,Join,Data.table,我正试图找到一种绕过这个请求特性的方法:在中提到过 基本上,我想在Y 前n列上的左连接(在下面的示例中{x,y}) 并选择Y中属于[t-w1,t+w2]区间的最后一列的值(t,在下面的示例中),其中t是X中的最后一列,通常t将是一个时间列,{w1,w2}一些整数(可能w1=w2=somethin/code>或w1=0) 我构建了以下示例(但请随意提供另一个/更好的示例) 结果将是 R) ans x y t IDX 1: 1 TRUE 2

我正试图找到一种绕过这个请求特性的方法:在中提到过

基本上,我想在
Y

  • 前n列上的左连接(在下面的示例中
    {x,y}
  • 并选择
    Y
    中属于
    [t-w1,t+w2]
    区间的最后一列的值(
    t
    ,在下面的示例中),其中t是
    X
    中的最后一列,通常
    t
    将是一个时间列,
    {w1,w2}
    一些整数(可能
    w1=w2=somethin/code>或
    w1=0
  • 我构建了以下示例(但请随意提供另一个/更好的示例)

    结果将是

    R) ans
       x     y                       t IDX
    1: 1  TRUE 2013-01-25 08:00:00.286   1
    2: 1  TRUE 2013-01-25 08:00:00.788  NA
    3: 1 FALSE 2013-01-25 08:00:00.407   3
    4: 2 FALSE 2013-01-25 08:00:00.882  NA
    5: 2 FALSE 2013-01-25 08:00:00.940  6,7
    
    但是:
    IDX
    如果多行
    Y
    (可能比
    X
    多行)匹配,一行就一行,或者如果没有匹配,则
    NA
    ,这里很可能是一个列表


    我也很乐意使用一些非数据。表格答案…

    这里是一个尝试,不是很优雅,没有
    数据。表格
    但是有
    plyr
    。我不知道它是否对你有用

    样本数据:

    X <- data.frame(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=rep(1,5)+sample(0:999,5,TRUE)/1e3)
    Y <- data.frame(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=rep(1,5)+sample(0:999,5,TRUE)/1e3, IDX=1:5)
    w1 <- 0.3
    w2 <- 0.3
    
    然后可以使用以下代码:

    m <- merge(X,Y, by=c("x","y"), all.x=TRUE, all.y=FALSE)
    m <- m[m$t.x>m$t.y-w1 & m$t.x<m$t.y+w2,]
    m <- ddply(m, c("x","y","t.x"), summarize, IDX=list(IDX))
    names(m) <- c("x","y","t","IDX")
    merge(X, m, by=c("x","y","t"), all.x=TRUE, all.y=FALSE)
    

    以下是数据表中朱巴代码的翻译(v.1.8.7 r797)


    我将等待一位专家说这是否是一个
    data.table最优的
    解决方案来关闭帖子。

    好东西!,我用
    m=(m$t.y-w1)和m$t.xYou get
    NULL
    得到了预期的答案,因为您正在列表中查找
    c(1,2,NA,NA,3)
    IDX
    )。比较
    integer(3)[c(1,2,NA,NA,3)]
    as.list(integer(3))[c(1,2,NA,NA,3)]
    X <- data.frame(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=rep(1,5)+sample(0:999,5,TRUE)/1e3)
    Y <- data.frame(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=rep(1,5)+sample(0:999,5,TRUE)/1e3, IDX=1:5)
    w1 <- 0.3
    w2 <- 0.3
    
    R> X
      x     y     t
    1 1  TRUE 1.880
    2 1  TRUE 1.364
    3 1 FALSE 1.288
    4 2 FALSE 1.170
    5 2 FALSE 1.172
    R> Y
      x     y     t IDX
    1 1  TRUE 1.482   1
    2 1  TRUE 1.252   2
    3 1 FALSE 1.216   3
    4 2 FALSE 1.674   4
    5 2 FALSE 1.047   5
    
    m <- merge(X,Y, by=c("x","y"), all.x=TRUE, all.y=FALSE)
    m <- m[m$t.x>m$t.y-w1 & m$t.x<m$t.y+w2,]
    m <- ddply(m, c("x","y","t.x"), summarize, IDX=list(IDX))
    names(m) <- c("x","y","t","IDX")
    merge(X, m, by=c("x","y","t"), all.x=TRUE, all.y=FALSE)
    
      x     y     t  IDX
    1 1 FALSE 1.288    3
    2 1  TRUE 1.364 1, 2
    3 1  TRUE 1.880   NA
    4 2 FALSE 1.170    5
    5 2 FALSE 1.172    5
    
    setkey(X,x,y,t); setkey(Y,x,y,t)
    m <- merge(X,Y, by=c("x","y"), all.x=TRUE, all.y=FALSE, allow.cartesian=TRUE)
    m <- m[t.x>=(t.y-w1) & t.x<=(t.y+w2)]
    m <- m[, list(IDX=list(IDX)), by=c("x","y","t.x")];
    setnames(m,"t.x","t");
    m <- m[X];
    
    R) m
       x     y                       t IDX
    1: 1 FALSE 2013-01-25 08:00:00.407   3
    2: 1  TRUE 2013-01-25 08:00:00.286   1
    3: 1  TRUE 2013-01-25 08:00:00.788
    4: 2 FALSE 2013-01-25 08:00:00.882
    5: 2 FALSE 2013-01-25 08:00:00.940 6,7