通过最接近的时间和r中的另一个键连接数据帧

时间:2019-08-16 02:18:32

标签: 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'键,但无法使其正常工作。谢谢

1 个答案:

答案 0 :(得分:0)

我快要加入:

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

它并没有给出我在示例中的确切信息(请参见预期结果),但是由于我的实际数据具有开始和结束时间,因此我能够使用<和>时间来创建联接键。如果有人可以添加到这个文件中,以便达到预期的效果?