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个示例中覆盖其他所有者。
谢谢你的帮助!
这是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没有滚动联接,也永远不会有更新联接,因此那里没有类似物。