【发布时间】:2018-12-11 10:34:26
【问题描述】:
我有 2 个数据框
df1 有 700,000 个数据点
- ID1:分类变量有 400 多个类别
- 日期 1:1 年数据
- MST1:2 级变量 1/2
- 确认号:唯一标识符
样本数据:
ID1 ExtractDate1 MktSeg1 ConfirmationNo
145 3/7/2017 2 29083253
145 3/7/2017 1 29085100
145 3/7/2017 1 29085102
145 3/7/2017 1 29085106
145 3/7/2017 1 29084895
145 3/7/2017 1 29084953
df2 有 100,000 个数据点
- ID2:分类变量有 400 多个类别
- 日期 2:1 年数据
- MST2:2 级变量 1/2
- Conf No:唯一标识符
我想创建一个新变量,标记为 df1,当 df1 和 df2 中存在确认号时标记为 1,否则为 0
我通过以下方式实现了这一点:
combi1 <- sqldf("SELECT Distinct ID1,
ExtractDate1,
MktSeg1,
ConfirmationNo,
CASE
WHEN confno IS NOT NULL
THEN 1
ELSE 0
END AS 'Flag'
FROM df1
LEFT JOIN df2 ON ID1 = ID2
AND ExtractDate2 >= ExtractDate1
AND ConfirmationNo = confno", drv = "SQLite")
要20-30多分钟才能出结果,有没有更好的办法?
我试过了
combi3 <- left_join(tbl_df(df1),tbl_df(df2),
by = c("ID1" = "ID2" , "ExtractDate1" <= "ExtractDate2", "ConfirmationNo" = "ConfNo")) %>%
select(distinct(ID1, ExtractDate1, MktSeg1, ConfirmationNo))
它抛出以下错误:
`by` can't contain join column `TRUE` which is missing from LHS
【问题讨论】:
-
转换为 data.table
setDT,然后设置 ID 列setkey的键,然后使用%in%,如下面 MHammer 的帖子中所建议的那样。
标签: r dplyr data-manipulation sqldf