在r中任何其他进程都比sqldf快

在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

我有两个数据帧

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          1    29085106
145  3/7/2017          1    29084895
145  3/7/2017          1    29084953
df2有100000个数据点

  • ID2:分类变量有400多个类别
  • 日期2:1年数据
  • MST2:2级变量1/2
  • 配置号:唯一标识符
我想创建一个新变量,flag to 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")

在第二个数据帧中使用您提供的数据和与之类似的数据,您可以使用%运算符中的
%:

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.table
setDT
,然后设置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")