gpt4 book ai didi

r - 窗口(又名滚动)与 data.table 连接

转载 作者:行者123 更新时间:2023-12-02 03:15:54 25 4
gpt4 key购买 nike

我正在尝试找到解决此请求功能的方法:[#2300] Add backwards and firstback to roll=TRUE this post中提到过.

基本上,我想对 X 执行以下“窗口连接”,在 Y 中查找

  1. 对前 n 列进行左连接(在以下示例中 {x,y})
  2. 并选择 Y 中属于 [t-w1,t+w2] 的最后一列(以下示例中的 t)的值code> 间隔,其中 t 是 X 中的最后一列,通常 t 是时间列和 {w1,w2} 一些整数(可能是w1=w2=somethingw1=0)

我构建了以下示例(但请随意提供另一个/更好的示例)

library(data.table)
set.seed(123);
X <- data.table(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=as.POSIXct("08:00:00.000",format="%H:%M:%OS")+sample(0:999,5,TRUE)/1e3)
Y <- copy(X)
set.seed(123)
Y[,`:=`(IDX=.I,t=t+sample(c(-5:5)/1e3,5,T))]
Y <- rbindlist(list(Y, X[5,][,IDX:=6][,t:=t+0.001], X[5,][,IDX:=7][,t:=t+0.002]))

所以 (w1,w2) = (.002,.002)

R) X                                 R) Y
x y t x y t IDX
1: 1 TRUE 2013-01-25 08:00:00.286 1: 1 TRUE 2013-01-25 08:00:00.284 1
2: 1 TRUE 2013-01-25 08:00:00.788 2: 1 TRUE 2013-01-25 08:00:00.791 2
3: 1 FALSE 2013-01-25 08:00:00.407 3: 1 FALSE 2013-01-25 08:00:00.407 3
4: 2 FALSE 2013-01-25 08:00:00.882 4: 2 FALSE 2013-01-25 08:00:00.886 4
5: 2 FALSE 2013-01-25 08:00:00.940 5: 2 FALSE 2013-01-25 08:00:00.945 5
6: 2 FALSE 2013-01-25 08:00:00.941 6 #by hand
7: 2 FALSE 2013-01-25 08:00:00.942 7 #by hand

结果是

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

但是:如果 Y 的多行(可以比 X 的行数多)匹配,这里的 IDX 很可能是一个列表,一对一,如果没有匹配则 NA

我也会对一些非 data.table 答案感到满意......

最佳答案

这是一个尝试,不是很优雅,没有 data.table 但有 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

这给出:

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

关于r - 窗口(又名滚动)与 data.table 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14524208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com