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
{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 getNULL
得到了预期的答案,因为您正在列表中查找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