我正在努力将一些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)
任何帮助将不胜感激。预先非常感谢。
答案 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,这似乎更明智。