在r中任何其他进程都比sqldf快
我有两个数据帧 df1有700000个数据点在r中任何其他进程都比sqldf快,r,dplyr,data-manipulation,sqldf,R,Dplyr,Data Manipulation,Sqldf,我有两个数据帧 df1有700000个数据点 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
- 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有100000个数据点
- ID2:分类变量有400多个类别
- 日期2:1年数据
- MST2:2级变量1/2
- 配置号:唯一标识符
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")
在第二个数据帧中使用您提供的数据和与之类似的数据,您可以使用%运算符中的
%:
df1 <- read.table(text = "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", header = TRUE)
df2 <- read.table(text = "ID1 ExtractDate1 MktSeg1 ConfirmationNo
145 3/7/2017 2 29083253
145 3/7/2017 1 29085106
145 3/7/2017 1 29084895
145 3/7/2017 1 29084953
145 3/7/2017 1 29084899
145 3/7/2017 1 29084959", header = TRUE)
df1$conf_flag <- as.numeric(df1$ConfirmationNo %in% df2$ConfirmationNo)
df1
df1如果您想坚持使用sqldf
,这可能不是最快的选项,那么您可以尝试重写查询以使用EXISTS
:
combi1 <- sqldf("SELECT ID1,
ExtractDate1,
MktSeg1,
ConfirmationNo,
CASE WHERE EXISTS (SELECT 1 FROM df2
WHERE ID1 = ID2
AND ExtractDate2 >= ExtractDate1
AND ConfirmationNo = confno)
THEN 1
ELSE 0
END AS Flag
FROM df1", drv = "SQLite")
combi1转换为data.tablesetDT
,然后设置ID列的键setkey
,然后使用%in%
,正如MHammer在下面的帖子中建议的那样。这对我来说很有效,速度也很快。非常感谢。我也试过了,但仍然需要更多的时间。它也完成了任务。非常感谢你。
df1 <- read.table(text = "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", header = TRUE)
df2 <- read.table(text = "ID1 ExtractDate1 MktSeg1 ConfirmationNo
145 3/7/2017 2 29083253
145 3/7/2017 1 29085106
145 3/7/2017 1 29084895
145 3/7/2017 1 29084953
145 3/7/2017 1 29084899
145 3/7/2017 1 29084959", header = TRUE)
df1$conf_flag <- as.numeric(df1$ConfirmationNo %in% df2$ConfirmationNo)
df1
combi1 <- sqldf("SELECT ID1,
ExtractDate1,
MktSeg1,
ConfirmationNo,
CASE WHERE EXISTS (SELECT 1 FROM df2
WHERE ID1 = ID2
AND ExtractDate2 >= ExtractDate1
AND ConfirmationNo = confno)
THEN 1
ELSE 0
END AS Flag
FROM df1", drv = "SQLite")