【问题标题】:R How to merge 2 data frames based on ID and latest status Date?R如何根据ID和最新状态日期合并2个数据框?
【发布时间】:2017-05-28 03:37:47
【问题描述】:

我正在尝试合并 2 个如下所示的数据框:

library(data.table)

#transactions
colNames<-c("id","tran")
df2 <- data.table(c("010","010","030","210","310","050"), as.Date(c("2012-12-28","2014-01-01","2011-07-05","2015-04-05","2013-07-05","2012-08-01")))
names(df2) <- colNames

#status change
colNames<-c("id","status")
df1 <- data.table(c("010","010","010","030","030","210","210","310","050"),
as.Date(c("2012-10-28","2013-11-01","2014-01-01","2011-05-09","2011-08-04","2013-07-06","2015-01-01","2013-05-04","2010-09-10")))
names(df1) <- colNames

变成如下结果:

df3
    id       tran       status
1: 010 2012-12-28   2012-10-28
2: 010 2014-01-02   2014-01-01
3: 030 2011-07-05   2011-05-09
4: 210 2015-04-05   2015-01-01
5: 310 2013-07-05   2013-05-04
6: 050 2012-08-01   2010-09-10
  • 事务多于状态更改。
  • 日期格式正确。
  • 每个数据框中有很多列,但这些是 重要的合并。

基本上,所有事务都在状态更改后的某个时间点发生。我正在尝试将所有事务与每个 ID 的相应状态更改合并。棘手的部分是日期几乎永远不会相同。 我需要每笔交易的状态更改日期...

我在看 ?merge 但我不明白它怎么能做这样的事情。也许是 ?aggregate 但它怎么知道聚合是以另一个数据帧为条件的?

谢谢!

【问题讨论】:

  • 我认为你在第三行有一个错误,但这可能应该是df2[df1, status := i.status, on = .(id, tran = status), roll = -Inf] 或者你可能想要df2[df1, status := i.status, on = .(id, tran = status), roll = "nearest"]
  • 修正了错误。很好,第一个版本看起来像我所追求的。如果您将其作为解决方案,我会接受。有没有地方可以读到这种操纵?这对我来说是新的。非常感谢!
  • 也许见this

标签: r data.table aggregate


【解决方案1】:

您可以简单地执行滚动连接。

df2[df1, status := i.status, on = .(id, tran = status), roll = -Inf]
df2
#     id       tran     status
# 1: 010 2012-12-28 2012-10-28
# 2: 010 2014-01-01 2014-01-01
# 3: 030 2011-07-05 2011-05-09
# 4: 210 2015-04-05 2015-01-01
# 5: 310 2013-07-05 2013-05-04
# 6: 050 2012-08-01 2010-09-10
  • roll = -Inf 只是意味着对于df2 中的每个事件,无论距离多远,我们都希望匹配df1 中最近的较低事件。
  • status := i.status 表示我们要在df2 通过引用(就地)创建一个名为status 的列,同时从df1$status 借用匹配值。 i. 表示位于 df2 中的 ith 表中的列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2016-01-30
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多