gpt4 book ai didi

r - 连接键值不完全相等的R data.tables-合并时间最近的行

转载 作者:行者123 更新时间:2023-12-03 12:44:40 24 4
gpt4 key购买 nike

在时间键值接近但不完全相同的R中,是否有一种巧妙的方式联接数据表?例如,假设我有一个针对不同时间段给出的结果数据表:

DT1 = data.table(x=rep(c("a","b","c"),each=3), time=c(10,30,60), v=1:9)


在这里,我们为在不同时间(时间)获取的不同类别(x)提供了一些值(v)。现在,假设我有另一个来源的数据,该数据提供了不同类别的一些时间值:

DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(10,10,60))


我可能想尝试尽可能地将DT2中的时间与DT1匹配,以预测DT2类别的值v。我想做类似的事情

setkeyv(DT2,c("x","time"))
merge(DT1,DT2,by=c("time","v")


哪个返回:

   time x v
1: 10 a 1
2: 10 b 4
3: 60 c 9


但是,如果我的时间没有同样的精度怎么办?例如:

DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(17,54,3))


有没有一种方法可以执行类似的合并,但是DT2的选择时间与DT1的选择时间接近?那就是17接近30、54接近60、3接近10?

如果这个简单的例子不清楚,我将简要解释我遇到的更大问题。我有一个带有列的数据表:类别,时间,输出1,输出2 ...有数百个具有相关时间的类别。我可能想在特定时间为所有类别提取输出1。由于时间是在没有明显逻辑的情况下进行采样的,因此有时会将时间四舍五入到最接近的偶数秒。在其他情况下,时间会四舍五入到最接近的分钟甚至10分钟。

我可以编写脚本以更常见的格式重写时间,但是我很好奇是否有一个鲜见的data.table解决方案,但我没有看到。我已经探索了滚动合并,但没有成功。

最佳答案

另一个选项可能是roll='nearest'(CRAN v1.8.8中的新功能)。

> setkey(DT1,x,time)
> DT1
x time v
1: a 10 1
2: a 30 2
3: a 60 3
4: b 10 4
5: b 30 5
6: b 60 6
7: c 10 7
8: c 30 8
9: c 60 9
> DT2
x time
1: a 17
2: b 54
3: c 3
> DT1[DT2,roll="nearest"]
x time v
1: a 17 1
2: b 54 6
3: c 3 7


请注意,与30相比,17看起来更接近10,因此结果在第一行中。

如果您需要滚动到下一个观察值(下一个观察值会向后移动):

> DT1[DT2,roll=-Inf]
x time v
1: a 17 2
2: b 54 6
3: c 3 7

关于r - 连接键值不完全相等的R data.tables-合并时间最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712826/

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