首页 > 解决方案 > R - 根据日期差异加入两个数据框

问题描述

让我们考虑两个数据帧 df1 和 df2。我想仅根据日期差异加入数据框。例如;

数据框 1:(df1)

| version_id | date_invoiced | product_id |
-------------------------------------------
|     1      | 03-07-2020    |   201      |
|     1      | 02-07-2020    |   2013     |
|     3      | 02-07-2020    |   2011     |
|     6      | 01-07-2020    |   2018     |
|     7      | 01-07-2020    |   201      |

数据框 2:(df2)

|  validfrom   | pricelist| pricelist_id |
------------------------------------------
|02-07-2020    |   10     |      101     |
|01-07-2020    |   20     |      102     |
|29-06-2020    |   30     |      103     |
|28-07-2020    |   10     |      104     |
|25-07-2020    |   5      |      105     |

我需要根据 df2 中的 validfrom 列映射 pricelist_id 和 pricelist。假设基于 date_invoiced (df1) 和 validfrom (df2) 之间的最小差异,应该映射该行。

预期结果:

| version_id | date_invoiced | product_id | date_diff | pricelist_id | pricelist |
----------------------------------------------------------------------------------
|     1      | 03-07-2020    |   201      |     1     |     101      |     10    |
|     1      | 02-07-2020    |   2013     |     1     |     102      |     20    |
|     3      | 02-07-2020    |   2011     |     1     |     102      |     20    |
|     6      | 01-07-2020    |   2018     |     1     |     103      |     30    |
|     7      | 01-07-2020    |   201      |     1     |     103      |     30    |

我需要完全根据差异进行映射,差异应该是最小的。始终,date_invoiced (df1) 与 validfrom (df2) 相比应该具有最接近的差异。谢谢

标签: rdataframejoin

解决方案


也许您可能想尝试使用date.table最近的卷。在这里,连接是在DATEfromDATEINVOICEDdf1inVALIDFROM上进行的df2

library(data.table)

setDT(df1)
setDT(df2)

df1$DATEINVOICED <- as.Date(df1$DATEINVOICED, format = "%d-%m-%y")
df2$VALIDFROM <- as.Date(df2$VALIDFROM, format = "%d-%m-%y")

setkey(df1, DATEINVOICED)[, DATE := DATEINVOICED]
setkey(df2, VALIDFROM)[, DATE := VALIDFROM]

df2[df1, on = "DATE", roll='nearest']

推荐阅读