【问题标题】:Conditional merging tables条件合并表
【发布时间】:2015-01-09 19:22:05
【问题描述】:

我有 2 张桌子:

    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 

如何将这 2 个表合并到一个按“时间”分组的表中,但有一个条件:第一个表中的月份必须与第二个表中的下个月匹配 - 比如第一个表中的 9 月应该与第二个表中的 10 月匹配.

谢谢!

【问题讨论】:

    标签: r date merge data.table aggregate


    【解决方案1】:

    这是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
    

    编辑:如果您不想要不匹配的行,请使用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
    

    【讨论】:

    • 谢谢!你能解释一下你为什么放-Inf吗?
    • 无论距离当前值多远,它都会回滚并匹配第一个匹配项。如果你注意到了,我在dat2 中设置了-1。它也适用于dat2[dat1, roll = -30],因为我们匹配一个月前(30 天)
    • 我们怎样才能不输出带有 NA 的行(没有匹配)?
    • 谢谢!但是,如果我不仅需要按“时间”分组,还需要按其他参数分组怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2012-09-07
    • 1970-01-01
    • 2016-02-08
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多