我想按最近的时间戳和另一个键合并/合并两个数据帧。
我已经创建了一些虚拟数据:
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'键,但无法使其正常工作。谢谢
答案 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
它并没有给出我在示例中的确切信息(请参见预期结果),但是由于我的实际数据具有开始和结束时间,因此我能够使用<和>时间来创建联接键。如果有人可以添加到这个文件中,以便达到预期的效果?