【问题标题】:update data.table based on last change in another data.table根据另一个 data.table 中的上次更改更新 data.table
【发布时间】:2014-10-14 22:36:55
【问题描述】:

我目前有两个如下所示的数据表:

dt1 <- data.table(urn=c("1","1","1","1","1","1","1","2","2","2","2","3","3","3","3","3","3","3","2"),
                  date=as.Date(c("2014-01-15","2014-02-15","2014-03-15","2014-04-15","2014-05-15","2014-06-15","2014-07-15",
                         "2014-04-15","2014-05-15","2014-06-15","2014-07-15",
                         "2014-04-15","2014-03-15","2014-05-15","2014-02-15","2014-06-14","2014-08-15","2014-07-15","2014-09-16")),
                  amount=c(20,20,15,15,15,20,25,
                           15,15,20,20,
                           30,30,30,30,25,25,25,20))

#dt1
#    urn       date amount
# 1:   1 2014-01-15     20
# 2:   1 2014-02-15     20
# 3:   1 2014-03-15     15
# 4:   1 2014-04-15     15
# 5:   1 2014-05-15     15
# 6:   1 2014-06-15     20
# 7:   1 2014-07-15     25
# 8:   2 2014-04-15     15
# 9:   2 2014-05-15     15
#10:   2 2014-06-15     20
#11:   2 2014-07-15     20
#12:   3 2014-04-15     30
#13:   3 2014-03-15     30
#14:   3 2014-05-15     30
#15:   3 2014-02-15     30
#16:   3 2014-06-14     25
#17:   3 2014-08-15     25
#18:   3 2014-07-15     25
#19:   2 2014-09-16     20

dt2 <- data.table(urn=c("1","2","3"), lastamount=c(25,20,25),lastchangedate=as.Date(c(NA,NA,NA)))

#dt2
#    urn lastamount lastchangedate
# 1:   1         25           <NA>
# 2:   2         20           <NA>
# 3:   3         25           <NA>

需要注意的几个重要事项,(1) 骨灰盒并不总是有序的,(2) 日期的排序并不总是正确的,(3) 金额可能会上升或下降,以及 (4) 日期可能会跳过一个月,并且 (5) 日期并不总是一个月中的同一天。

我想要实现的是一种更新 dt2 lastchangedate 以反映金额更改(增加或减少)的最近日期的方法。

所以我希望 dt2 在处理后看起来如下所示。

#dt2
#    urn lastamount lastchangedate
# 1:   1         25     2014-07-15
# 2:   2         20     2014-06-15
# 3:   3         25     2014-06-14

这显然是一个样本数据集。给出一个数量级,我的真实 dt1 有 350 万条记录,而 dt2 有 25 万条记录。

谢谢

更新: 由于我的真实 dt2 具有比示例中显示的更多的列,因此我需要能够将它们保留在我的最终输出中。我不想覆盖 dt2 的当前实例,我只想单独更新 lastchangedate。下面是我使用的代码。

setkey(dt1, urn) # this is after I had used setkey(dt1, urn, date) to order dt1 properly
setkey(dt2, urn)

dt2[dt1[,list(lastchangedate=max(date[which(diff(amount)!=0)+1])), 
    by=urn],lastchangedate:=i.lastchangedate]

【问题讨论】:

  • 对 stackoverflow 还很陌生,我试图了解如何提出有用的问题。我非常感谢您对这个问题的反馈意见没有帮助,以便我可以在未来进行改进。

标签: r join data.table


【解决方案1】:

应该这样做:

setkey(dt1, urn, date)   ## sort table
dt2 <- dt1[, list(lastamount=amount[.N],
                  lastchangedate=max(date[which(diff(amount)!=0)+1])), 
           by=urn]

最后一行查看diff(amount) != 0 的位置并将其偏移一个(发生更改的行的索引)并返回最新日期(max)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多