Doc*_*ada 19 time r data.table
是否有一种灵活的方式来连接R中的数据表,其中时间的关键值接近,但不完全相同?例如,假设我有一个为不同时间段提供的结果数据表:
DT1 = data.table(x=rep(c("a","b","c"),each=3), time=c(10,30,60), v=1:9)
Run Code Online (Sandbox Code Playgroud)
在这里,我们对不同时间(时间)采用的不同类别(x)有一些值(v).现在假设我有来自另一个源的数据,它为不同的类别提供了一些时间值:
DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(10,10,60))
Run Code Online (Sandbox Code Playgroud)
我可能有兴趣尝试尽可能地将DT2中的时间与DT1匹配,以预测我的DT2类别的值v.我想做点什么
setkeyv(DT2,c("x","time"))
merge(DT1,DT2,by=c("time","v")
Run Code Online (Sandbox Code Playgroud)
哪个回报:
time x v
1: 10 a 1
2: 10 b 4
3: 60 c 9
Run Code Online (Sandbox Code Playgroud)
但是,如果我的时代没有相同的精度怎么办?例如:
DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(17,54,3))
Run Code Online (Sandbox Code Playgroud)
有没有办法执行类似的合并,但选择接近DT1的DT2时间?那是17接近30,54接近60,接近10接近3?
如果这个简单的例子不清楚,我将简要解释一下我遇到的更大的问题.我有一个包含列的数据表:category,time,output1,output2 ......有数百个类别和关联时间.我可能想在特定时间为所有类别提取输出1.由于时间采样没有明显的逻辑,有时时间四舍五入到最接近的偶数秒; 在其他情况下,时间四舍五入到最接近的分钟甚至10分钟.
我可以编写一个脚本以更常见的格式重写时间,但我很好奇是否有一个我没见过的灵活的data.table解决方案.我已经探索了滚动合并没有成功.
Mat*_*wle 21
另一种选择可能是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
Run Code Online (Sandbox Code Playgroud)
请注意,17似乎更接近10而不是30,因此结果在第一行.
如果您需要滚动到下一个观察点(下一个观察结果向后):
> DT1[DT2,roll=-Inf]
x time v
1: a 17 2
2: b 54 6
3: c 3 7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4480 次 |
| 最近记录: |