条件合并表 [英] Conditional merging tables

查看:97
本文介绍了条件合并表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2张书:

 时间X1 
8/1/2013 56
9/1 / 2013 14
10/1/2013 8
11/1/2013 4
12/1/2013 78

时间X2
8/1 / 2013 42
9/1/2013 44
10/1/2013 2
11/1/2013 75
12/1/2013 36

如何通过时间合并这两个表在一个表分组中,但有一个条件:从第一个表的月份必须匹配下一个月形成第二个 - 比如从第一个表的第九个表应该匹配从第二个表的十月。



谢谢!

c> c> 滚动加入

  library(data.table)
setkey(setDT(dat1)[,Time:= as.Date(Time,format =%m /%d /%Y)],时间)
setkey(setDT(dat2)[,Time:= as.Date(Time,format =%m /%d /%Y) - 1],时间)
dat2 [dat1,roll = -Inf ]
#时间X2 X1
#1:2013-08-01 44 56
#2:2013-09-01 2 14
#3:2013-10-01 75 8
#4:2013-11-01 36 4
#5:2013-12-01 NA 78

编辑:如果不想要不匹配的行,请使用 nomatch = 0

  dat2 [dat1,roll = -Inf,nomatch = 0] 
#时间X2 X1
#1:2013-08-01 44 56
#2:2013-09-01 2 14
#3:2013-10-01 75 8
#4:2013-11-01 36 4


I have 2tables:

    Time      X1  
  8/1/2013    56 
  9/1/2013    14   
  10/1/2013    8  
  11/1/2013    4  
  12/1/2013   78  

    Time      X2  
  8/1/2013    42 
  9/1/2013    44   
  10/1/2013    2  
  11/1/2013   75  
  12/1/2013   36 

How can I merge those 2 table in one table grouping by "Time" but with one condition: the month from first table must match with the following month form the second - like September from first table should match with October from second table.

Thank you!

解决方案

This is a perfect job for data.table rolling join

library(data.table)
setkey(setDT(dat1)[, Time := as.Date(Time, format = "%m/%d/%Y")], Time)
setkey(setDT(dat2)[, Time := as.Date(Time, format = "%m/%d/%Y") - 1], Time)
dat2[dat1, roll = -Inf]
#          Time X2 X1
# 1: 2013-08-01 44 56
# 2: 2013-09-01  2 14
# 3: 2013-10-01 75  8
# 4: 2013-11-01 36  4
# 5: 2013-12-01 NA 78

Edit: If you don't want the unmatched row, use nomatch = 0

dat2[dat1, roll = -Inf, nomatch = 0]
#          Time X2 X1
# 1: 2013-08-01 44 56
# 2: 2013-09-01  2 14
# 3: 2013-10-01 75  8
# 4: 2013-11-01 36  4

这篇关于条件合并表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆