根据最近的日期进行映射

Mat*_* W. 3 join r left-join dplyr

我想列出一个具有相关“所有者”和日期的电子邮件列表,并将它们与收到的订单进行匹配,并带有日期和值。匹配密钥是电子邮件,但我希望它在最近的日期匹配,因为在某些情况下,电子邮件地址可能有2个不同的所有者。

可重现的示例:

require(dplyr)

e <- c("e3r@gmail.com", "e3r@gmail.com", "poi@aol.com", "tyu@gmail.com", "poi@aol.com", "tyu@gmail.com")
d <- c("2017-01-01", "2017-04-05", "2017-04-12", "2017-05-05", "2017-08-05", "2017-12-05")
p <- c("Jeff", "Sam", "Sam", "Jeff", "Matt", "Matt")
df <- data_frame(e, d, p) %>% mutate(d=as.Date(d))

o <- c("e3r@gmail.com", "poi@aol.com", "sdf@gmail.com", "tyu@gmail.com")
d2 <- c("2017-02-02", "2017-04-28", "2017-05-05", "2017-07-01")
a <- c(600.50, 3000, 4999.99, 2050.6)
df2 <- data_frame(o, d2, a) %>% mutate(d2 = as.Date(d2))
Run Code Online (Sandbox Code Playgroud)

第一个df是电子邮件地址的地图归p个人所有。这df2是这些电子邮件地址附带的订单,我想在该列上添加一列df2,以固定正确的“所有者”,即为该电子邮件地址分配了日期并且最接近日期的人。

预期结果:

> df2
# A tibble: 4 x 3
              o         d2       a       newowner
          <chr>     <date>   <dbl>       <char>
1 e3r@gmail.com 2017-02-02  600.50       "Jeff"
2   poi@aol.com 2017-04-28 3000.00       "Sam"
3 sdf@gmail.com 2017-05-05 4999.99       NA
4 tyu@gmail.com 2017-07-01 2050.60       "Jeff"
Run Code Online (Sandbox Code Playgroud)

当前,这不是一个大问题-在“拥有的”电子邮件地址的7万条记录中,仅有约86个重复案例。但是,所有权在一年的最后几个月一直在变化,因此如果所有权转移,可能会导致很多重复。我目前正在从最远的日期开始寻找所有者,并在这86个示例中覆盖其他所有者。

谢谢你的帮助!

Fra*_*ank 6

这是data.table中的标准滚动更新联接:

library(data.table)
DT = data.table(df)
DT2 = data.table(df2)
DT2[DT, on=.(o = e, d2 = d), roll=-Inf, v := i.p ]

               o         d2       a    v
1: e3r@gmail.com 2017-02-02  600.50 Jeff
2:   poi@aol.com 2017-04-28 3000.00  Sam
3: sdf@gmail.com 2017-05-05 4999.99   NA
4: tyu@gmail.com 2017-07-01 2050.60 Jeff
Run Code Online (Sandbox Code Playgroud)

如果每个标题都想要最接近的匹配,请使用roll = "nearest"代替roll = -Inf

Dplyr没有滚动联接,也永远不会有更新联接,因此那里没有类似物。