带有 WHERE 和 HAVING 子句的 sqldf 中的 LEFT OUTER JOIN

Ric*_*ron 3 r sqldf

我在 R 中有两个数据框,我想有条件地将它们合并到id和 上day。合并是right合并到left变量的变量尽可能是新的/新鲜的/最近的,但必须至少是三天前的。

但是,如果没有匹配的right,以我的id-date在对left我还是想留住他们。我的研究有两个部分,所以我不想放弃的id-day意见,只是因为他们是不完整的。

我可以sqldf一步完成吗?我目前的方法需要一个额外的基础 R merge

left <- data.frame(id=rep(1:5, each=10),
                   day=rep(1:10, times=5),
                   x=rnorm(5*10))
right <- data.frame(id=rep(1:2, each=21),
                   day=rep(-10:10, times=2),
                   y=rnorm(2*21))
combined <- sqldf("SELECT L.id, L.day, L.x, R.y
                  FROM left L LEFT OUTER JOIN right R
                  ON (L.id = R.id)
                  WHERE ((L.day - R.day) >= 3)
                  GROUP BY L.id, L.day
                  HAVING (R.day = MAX(R.day))")
combined                  

combined.2 <- merge(left, combined, all=TRUE)
combined.2 
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 5

尝试像这样嵌套 select 语句:

sqldf("SELECT * from left
       LEFT JOIN (SELECT id, L.day, L.x, R.y
                  FROM left L LEFT OUTER JOIN right R
                  USING (id)
                  WHERE ((L.day - R.day) >= 3)
                  GROUP BY L.id, L.day
                  HAVING (R.day = MAX(R.day))) 
       USING (id, day, x)")
Run Code Online (Sandbox Code Playgroud)

这也可以如下进行。它使用的事实是,如果使用 max,则同一结果行上的其他值保证来自与 max 相同的原始行。这是 SQLite 提供的 SQL 扩展。

sqldf("select max(R.day) as maxRday, L.*, R.y
  from left L left outer join right R
  on L.id = R.id and L.day - R.day >= 3
  group by L.id, L.day")[-1]
Run Code Online (Sandbox Code Playgroud)