首页 > 解决方案 > 按最接近的时间和 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”键,但无法使其正常工作。谢谢

标签: r

解决方案


我接近要求加入:

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

它并没有准确给出我在示例中所追求的内容(请参阅预期结果),但由于我的真实数据具有开始和结束时间,我能够使用 < 和 > 创建连接键的时间。如果有人可以添加到这一点,以便我可以达到我的预期结果?


推荐阅读