【问题标题】:How do I join two dataframes, based on conditions, with no common variable?如何在没有公共变量的情况下根据条件连接两个数据框?
【发布时间】:2019-05-19 00:07:59
【问题描述】:

我正在尝试在 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。我没有公共列,因此无法合并我的数据框。

【问题讨论】:

  • 您应该能够将该查询放入sqldf,只需进行最少的更改。删除work. 部分、proc sql;;quit;,并以select ... 开始查询。那么,你试过了吗?是否有错误,如果有,是什么错误?
  • 你能提供我选择两个数据帧的第一行代码吗?我能找到的文档只显示了一个数据框的参数
  • 它接受像proc sql这样的普通SQL查询,counts_2018 &lt;- sqldf('select a.*, b.cell_no from universe201808 a, selpar17 b where a.newregionxx = b.lower_region2 and a.froempment &gt;= b.lower_size and a.froempment &lt;= b.upper_size and a.frosic07_2 &gt;= b.lower_class2 and a.frosic07_2 &lt;= b.upper_class2')应该可以工作。
  • 啊,我错过了 ' ' 。唯一的问题是“rsqlite_send_query(conn@ptr, statement) 中的错误:靠近“where”:语法错误“
  • 好的,那你就得分享你的数据了,否则没人能重现这个问题。

标签: sql r sas inner-join sqldf


【解决方案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

【讨论】:

  • 这个 ANSI 规范的名称是什么?我想进一步研究一下。
  • 业界定期更新 SQL 语言的 ANSI 规范,特别是 1992、1999、2003、2008 等。有关实际 docs 的链接,请参阅此答案。大多数 RDBMS 都坚持 1992 年。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多