如何根据条件加入两个没有公共变量的数据框?
How do I join two dataframes, based on conditions, with no common variable?
我正在尝试在 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 分配给 [=19] 中的数据=]universe201808,基于满足代码中概述的 所有 6 个条件。不满足这些条件并因此不会分配 cell_no 的数据不包含在最终的 table.[=13= 中]
到目前为止我发现的documentation/answers都是从一个步骤开始的,其中两个数据帧由一个公共变量合并,然后执行sqldf
select
。我没有公共列,因此无法合并我的数据框。
目前,您是 运行 两个表之间的隐式联接,SQL 中不建议这样做。根据 ANSI-1992(超过 25 年的规范)使显式 JOIN
成为加入关系的标准方式,请考虑相应地修改您的 SQL 查询。
与您的陈述相反,您实际上 do 在表之间有一个公共列,如您的相等条件所示: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
我正在尝试在 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 分配给 [=19] 中的数据=]universe201808,基于满足代码中概述的 所有 6 个条件。不满足这些条件并因此不会分配 cell_no 的数据不包含在最终的 table.[=13= 中]
到目前为止我发现的documentation/answers都是从一个步骤开始的,其中两个数据帧由一个公共变量合并,然后执行sqldf
select
。我没有公共列,因此无法合并我的数据框。
目前,您是 运行 两个表之间的隐式联接,SQL 中不建议这样做。根据 ANSI-1992(超过 25 年的规范)使显式 JOIN
成为加入关系的标准方式,请考虑相应地修改您的 SQL 查询。
与您的陈述相反,您实际上 do 在表之间有一个公共列,如您的相等条件所示: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