在R中使用带有嵌套条件的子集函数

时间:2019-02-19 23:10:44

标签: sql r sql-server

我正在努力将一些SQL查询转换为R。我比R更擅长SQL,但是由于功能比我大,我需要切换到R,因此,如果这是基本的R东西,我深表歉意。我在这里找不到任何可解决我问题的类似问题。

我有以下格式的数据表(第一行是列名,第二行是数据):

CID, DID, SID, ECSTART, ECEND, EC, LASTASSIGNED, LASTCLOSE
123, 456, 789, 2017-05-02, 2018-03-20, John Smith, 2014-06-01, 2018-05-01

我有一个SQL查询,它会为每个EC计数不同的CID,但有一些限制:

SELECT EC, COUNT(DISTINCT CID)
FROM dbo.table
WHERE ECSTART < '2018-09-01'
AND (ECEND > '2018-09-30' OR ECEND IS NULL)
AND LASTASSIGNED < '2018-09-01' AND (LASTCLOSE > '2018-09-30' OR LASTCLOSE IS NULL)
AND DID != '999999'
GROUP BY EC
ORDER BY EC

此查询给了我预期的结果。似乎在R中使用子集函数将是使所有这些条件在R中都能工作的方式。我的尝试:

table(subset(data$EC, data$ECSTART < '2018-09-01'
         & (data$ECEND > '2018-09-30' | is.null(data$ECEND))
         & data$LASTASSIGNED < '2018-09-01'
         & (data$LASTCLOSE > '2018-09-30' | is.null(data$LASTCLOSE))
         & data$DID != 999999))

R代码运行时没有错误,但是给了我完全错误的结果。我尝试逐段运行R代码以查看发生了什么,看来它可能以与SQL查询中的WHERE子句根本不同的方式提取子集。我可能对子集函数的工作方式有一个误解,但是我在?subset和在线搜索中阅读的所有内容都使我认为它应该起作用,也许只是与我使用的方式不同它。如果它们更适合这种情况,我完全愿意使用其他R函数。

我还尝试使用R中开始的SQL,方法是将其包装在sqldf函数中并使用sqldf库。当我运行它时,它不会出错或不会产生任何结果,这就是它吐出来的全部内容:

[1] EC                  COUNT(DISTINCT CID)
<0 rows> (or 0-length row.names)

任何帮助将不胜感激。预先非常感谢。

1 个答案:

答案 0 :(得分:1)

我无法向您保证这会起作用,因为我没有可重现的示例对其进行测试,但是处理这种问题的 dplyr 方法如下所示:

data %>%
    filter(CSTART < '2018-09-01'
                 & (ECEND > '2018-09-30' | is.na(ECEND))
                 & LASTASSIGNED < '2018-09-01'
                 & (LASTCLOSE > '2018-09-30' | is.na(LASTCLOSE))
                 & DID != 999999)) %>%
    group_by(EC) %>%
    summarise(n = n_distinct(CID))

如果您来自SQL,这似乎更明智。