【问题标题】:R: How to join two data tables by nearest single time-date?R:如何按最近的单个时间日期连接两个数据表?
【发布时间】:2021-05-31 10:37:29
【问题描述】:

我希望有人可以帮助我。我有两张表需要在最近的日期加入。以下是一些示例数据:

new <- data.table( date = as.Date( c( "2016-03-02", "2016-03-04", 
                                     "2016-04-02" ) ), data.new = c( "t","u","v" ) )

old <- data.table( date = as.Date( c( "2016-03-01", "2016-03-07", 
                                     "2016-04-02", "2015-03-02" ) ), 
               data.old = c( "a","b","c","d" ) )

我正在寻找一些使用 data.table 包的解决方案。我找到了这个解决方案:

setkeyv(new, "date")
setkeyv(old, "date")
combined <- new[old, roll = "nearest"]

解决方案如下:

> new
         date data.new
1: 2016-03-02        t
2: 2016-03-04        u
3: 2016-04-02        v

> old
         date data.old
1: 2016-03-01        a
2: 2016-03-07        b
3: 2016-04-02        c
4: 2015-03-02        d

> combined
         date data.new data.old
1: 2015-03-02        t        d
2: 2016-03-01        t        a
3: 2016-03-07        u        b
4: 2016-04-02        v        c

但这并不是我想要实现的,请参阅下面的所需输出: 在这种特殊情况下,日期“2015-03-02”和“2016-03-01”在“新”中没有对应的匹配项。最后只有最近的日期“2016-03-01”得到匹配值,而“2015-03-02”的匹配值保留为NA。

> combined
         date data.new data.old
1: 2015-03-02        NA       d
2: 2016-03-01        t        a
3: 2016-03-07        u        b
4: 2016-04-02        v        c

感谢您的帮助!一个后续问题是,如果有多个 ID 怎么办?这意味着,如果需要对数据进行分组怎么办?谢谢!

【问题讨论】:

  • 我认为你在 new 中的对应匹配是2016-03-02。
  • 是的,也许我需要更精确。我的意思是 2015-03-02 和 2016-03-01 在“新”中没有完全对应的匹配。也许这更清楚?

标签: r join data.table


【解决方案1】:

滚动结果不完美是由于old 和new 的长度不同。 然后解决方案非常直观。为了让它们有相同的大小,我将rbind一些行放在较短的data.table的头部new。

new <- data.table( date = as.Date( c( "2016-03-02", "2016-03-04", 
                                     "2016-04-02" ) ), data.new = c( "t","u","v" ) )

old <- data.table( date = as.Date( c( "2016-03-01", "2016-03-07", 
                                     "2016-04-02", "2015-03-02" ) ), 
               data.old = c( "a","b","c","d" ) )

head_row <- data.table(date = old[,min(date)],
                       data.new = NA)
new <- rbind(head_row,new)
setkey(new,date)
setkey(old,date)
new[old, roll = "nearest"]

【讨论】:

  • 您好,感谢您的回答!这可行,但实际上我有一个更大的数据集,其中 data.table new 的行数比 data.table old 少得多,例如10 对 200 行。我想知道是否有任何功能可以解决这个问题?谢谢!
  • 这个方法当然可以扩展。关键是将head_row构建为new和old的差异大小。
  • 啊,我明白了!所以这意味着只要我有两个大小相同的数据集,应用 roll = nearest 只会合并最近的日期。对吗?
  • 是的。我想是这样。您可以使用更大的数据集进行检查。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2020-02-09
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多