r - 按最接近的时间和 r 中的另一个键加入数据帧
问题描述
我想通过最近的时间戳和另一个键合并/连接两个数据帧。
我创建了一些虚拟数据:
tm<-c('22/03/2012 11:50', '22/03/2012 14:40', '10/01/2012 3:21',
'10/01/2012 6:48', '10/01/2012 7:30')
vgid<-c('a', 'a', 'a', 'b', 'b')
count<- c(34, 56, 767, 88, 990)
d1<-data.frame(tm, vgid, count)
tm<-c('22/03/2012 11:51', '22/03/2012 14:41', '10/01/2012 3:21',
'10/01/2012 6:41', '10/01/2012 7:31')
vgid<-c('b', 'b', 'a', 'b', 'b')
dcount<-c(35, 678, 88, 55, 33)
d2<-data.frame(tm, vgid, dcount)
格式化时间
d1$tm<-dmy_hm(d1$tm)
d2$tm<-dmy_hm(d2$tm)
并运行以下代码
d <- function(x,y) abs(x-y) # define the distance function
idx <- sapply(d1$tm, function(x) which.min( d(x,d2$tm) )) # find matches
d12tb<-cbind(d1,d2[idx,-1,drop=FALSE])
d12tb
这使
tm vgid count vgid dcount
2012-03-22 11:50:00 a 34 b 35
2012-03-22 14:40:00 a 56 b 678
2012-01-10 03:21:00 a 767 a 88
2012-01-10 06:48:00 b 88 b 55
2012-01-10 07:30:00 b 990 b 33
我希望结果看起来像:
tm vgid count xtm xvgid dcount
22/03/2012 11:50 a 34 na na na
na na na 22/03/2012 11:51 b 35
22/03/2012 14:40 a 56 na na na
na na na 22/03/2012 14:41 b 678
10/01/2012 3:21 a 767 10/01/2012 3:21 a 88
10/01/2012 6:48 b 88 10/01/2012 6:41 b 55
10/01/2012 7:30 b 990 10/01/2012 7:31 b 33
或者更好
22/03/2012 11:50 a 34 na na na
22/03/2012 11:51 b na 22/03/2012 11:51 b 35
22/03/2012 14:40 a 56 na na na
22/03/2012 14:41 b na 22/03/2012 14:41 b 678
10/01/2012 3:21 a 767 10/01/2012 3:21 a 88
10/01/2012 6:48 b 88 10/01/2012 6:41 b 55
10/01/2012 7:30 b 990 10/01/2012 7:31 b 33
显然,我还需要包含“vgid”键,但无法使其正常工作。谢谢
解决方案
我接近要求加入:
d1$tmn<-as.numeric(d1$tm)
d2$tmn<-as.numeric(d2$tm)
d12<-fuzzy_join(
d1, d2,
by = c(
"tmn"="tmn",
"vgid" = "vgid"
),
match_fun = list(`==`, `==`)
)
d12
tm.x vgid.x count tmn.x tm.y vgid.y dcount tmn.y
2012-01-10 03:21:00 a 767 1326165660 2012-01-10 03:21:00 a 88 1326165660
它并没有准确给出我在示例中所追求的内容(请参阅预期结果),但由于我的真实数据具有开始和结束时间,我能够使用 < 和 > 创建连接键的时间。如果有人可以添加到这一点,以便我可以达到我的预期结果?
推荐阅读
- python-3.x - plotly.express.line:如何使用 line_dash_map 更改线条样式?
- c# - 如何在 winforms 中使用 c# 连接到 IP 摄像机?
- flutter - Flutter - 如何在同一页面上构建带有预览的多图像选择器?
- amazon-web-services - 用于响应式 Webclient 的 AWS traceID 注入
- excel - 如何解决 vba 中 Selection.ShapeRange.Item(1) 的“对象不支持此属性或方法”错误
- javascript - 如何使用css底部对齐div?
- c# - XUnit 测试可以在要测试的项目中运行吗?
- camunda - Camunda - 无法从其他租户访问一个租户的资源
- powerbi - 如果条件满足,则返回中值(来自另一个度量的过滤器)
- swiftui - 单击小部件时重置链接