如何根据条件加入两个没有共同变量的数据框?

时间:2018-12-18 14:34:16

标签: sql r sas inner-join sqldf

我正在尝试在R中重新创建以下SAS代码

PROC SQL;
    create table counts_2018 as 
    select a.*, b.cell_no 
    from work.universe201808 a, work.selpar17 b 
    where a.newregionxx = b.lower_region2 
      and a.froempment >= b.lower_size 
      and a.froempment <= b.upper_size 
      and a.frosic07_2 >= b.lower_class2 
      and a.frosic07_2 <= b.upper_class2;
QUIT;

实际上,这是根据<<>的满足,将 selpar17 中找到的 cell_no 分配给 universe201808 中的数据。代码中列出的strong>所有6个条件。不能满足这些条件并因此没有为其分配 cell_no 的数据不包含在最终表中。

到目前为止,我发现的所有文档/答案都从以下步骤开始:将两个数据框由一个公共变量合并,然后执行sqldf select。我没有公共列,因此无法合并数据框。

1 个答案:

答案 0 :(得分:1)

当前,您正在两个表之间运行隐式联接,SQL中不建议这样做。根据使显式JOIN成为连接关系的标准方式的ANSI-1992(25年规范),请考虑相应地修改SQL查询。

与您的陈述相反,实际上,在表之间具有相同的列,如相等条件所示:a.newregionxx = b.lower_region2可以用作JOIN条件。甚至可以使用BETWEEN运算符进行简化:

new_df <- sqldf('select u.*, s.cell_no 
                 from universe201808 u
                 inner join selpar17 s 
                         on u.newregionxx = s.lower_region2 
                 where u.froempment between s.lower_size and s.upper_size 
                   and u.frosic07_2 between s.lower_class2 and s.upper_class2')

实际上,您可以完全删除where并将其全部放在on子句中:

...
on u.newregionxx = s.lower_region2 
and u.froempment between s.lower_size and s.upper_size 
and u.frosic07_2 between s.lower_class2 and s.upper_class2
相关问题