簡體   English   中英

R 如何根據 ID 和最新狀態日期合並 2 個數據框?

[英]R How to merge 2 data frames based on ID and latest status Date?

我正在嘗試合並 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
#     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中第i個表中的列的狀態

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM