gpt4 book ai didi

在具有多个匹配项的 data.table 中滚动连接

转载 作者:行者123 更新时间:2023-12-02 00:07:55 25 4
gpt4 key购买 nike

我有一个关于滚动连接的评论/问题
设 X,Y 为:

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]))
setkey(X,x,y,t)
setkey(Y,x,y,t)

这里 XYx,y,t 排序
R) X
x y t
1: 1 FALSE 2013-06-20 08:00:00.407
2: 1 TRUE 2013-06-20 08:00:00.286
3: 1 TRUE 2013-06-20 08:00:00.788
4: 2 FALSE 2013-06-20 08:00:00.882
5: 2 FALSE 2013-06-20 08:00:00.940
R) Y
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00.407 3
2: 1 TRUE 2013-06-20 08:00:00.284 1
3: 1 TRUE 2013-06-20 08:00:00.791 2
4: 2 FALSE 2013-06-20 08:00:00.886 4
5: 2 FALSE 2013-06-20 08:00:00.940 6
6: 2 FALSE 2013-06-20 08:00:00.942 7
7: 2 FALSE 2013-06-20 08:00:00.945 5



正在执行 Y[X, roll=-0.005]得到你
R) Y[X, roll=-0.005]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00.407 NA => due to precision the roll is no match
2: 1 TRUE 2013-06-20 08:00:00.286 NA => ok
3: 1 TRUE 2013-06-20 08:00:00.788 2 => ok (x,y) matched and 788-791=-3
4: 2 FALSE 2013-06-20 08:00:00.882 4 => same
5: 2 FALSE 2013-06-20 08:00:00.940 6 => NOT AN EXACT MATCH (precision)

所以我本来希望为最后一行获得更多行,因为“mult”的默认行为是“all”,而 X 的最后一行由行匹配 5,6, may be 7Y

最佳答案

第一排

X的第一行只有第一排Y有匹配 xy所以第一行Y将匹配 iff Y$t[1]介于 X$t[1] 之间和 X$t[1] + 0.005但实际上Y$t[1] < X$t[1]如这里所见:

> X$t[1] - Y$t[1]
Time difference of 0.0009999275 secs

一个人需要一个积极的 roll=其幅度至少等于上述差异的值,以便在第 1 行中获得非 NA。例如
> Y[X, roll=0.001]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00 3
2: 1 TRUE 2013-06-20 08:00:00 NA
3: 1 TRUE 2013-06-20 08:00:00 NA
4: 2 FALSE 2013-06-20 08:00:00 NA
5: 2 FALSE 2013-06-20 08:00:00 NA

请注意,您可以使用 rollends= 强制它。像这样:
> Y[X, roll = -0.005, rollends = TRUE]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00 3
2: 1 TRUE 2013-06-20 08:00:00 NA
3: 1 TRUE 2013-06-20 08:00:00 2
4: 2 FALSE 2013-06-20 08:00:00 4
5: 2 FALSE 2013-06-20 08:00:00 6

最后一行
X的最后一行只有 Y 的第 5 行匹配,而不是 5、6 和 7,因为只有最近的符合条件的行才匹配。 mult=仅适用于多个匹配项,通常不适用于 roll= (有关异常(exception),请参阅底部的示例):

另请注意 Y 的第 5、6 和 7 行没有相同的时间。它们的次数越来越多,因此不可能全部匹配:
> dput(Y[["t"]])
structure(c(1371729600.407, 1371729600.285, 1371729600.791, 1371729600.887,
1371729600.941, 1371729600.942, 1371729600.945), class = c("POSIXct",
"POSIXt"))

即使 Y 的第 5、6 和 7 行如果这些时间与 X 最后一行中的时间不同,则具有相同的时间那么一个人只能得到一排。
> # times in rows 5, 6 and 7 of Y2 are same
> Y2 <- copy(Y)
> Y2[, t:= t[c(1:4, 5, 5, 5)]]
> setkey(Y2, x, y, t)
> Y2[X, roll = -0.005]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00 NA
2: 1 TRUE 2013-06-20 08:00:00 NA
3: 1 TRUE 2013-06-20 08:00:00 2
4: 2 FALSE 2013-06-20 08:00:00 4
5: 2 FALSE 2013-06-20 08:00:00 6

仅当“Y”的第 5、6 和 7 行具有相同的时间 X的最后一行也有一个人多次退出的时间,在这种情况下 mult=可以申请:
> # time in row 5 of X2 same as the times in rows 5, 6 and 7 of Y2
> X2 <- copy(X)
> X2[, t:=c(t[1:4], Y2[["t"]][5])]
> Y2[X2, roll = -0.005]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00 NA
2: 1 TRUE 2013-06-20 08:00:00 NA
3: 1 TRUE 2013-06-20 08:00:00 2
4: 2 FALSE 2013-06-20 08:00:00 4
5: 2 FALSE 2013-06-20 08:00:00 6
6: 2 FALSE 2013-06-20 08:00:00 7
7: 2 FALSE 2013-06-20 08:00:00 5
>
> Y2[X, roll = -0.005, mult = "first"]
x y t IDX
1: 1 FALSE 2013-06-20 08:00:00 NA
2: 1 TRUE 2013-06-20 08:00:00 NA
3: 1 TRUE 2013-06-20 08:00:00 2
4: 2 FALSE 2013-06-20 08:00:00 4
5: 2 FALSE 2013-06-20 08:00:00 6

它的工作原理从文档中不是很清楚,我不得不通过反复试验来发现它是如何工作的。 ?data.table确实说“通常,x 的键中不应该有重复项”(在我们的示例中,这里 x 是 Y),因此开发人员可能希望在这种情况下不定义它并接受 future 的更改。

使用思路 mult=正如您所描述的,这似乎是一个非常有趣的想法,但它目前的工作方式似乎并非如此。也许将来可以。

关于在具有多个匹配项的 data.table 中滚动连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17216843/

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