【问题标题】:SAS proc sql disqualify observations that have already been mergedSAS proc sql取消已经合并的观察
【发布时间】:2015-05-22 21:32:09
【问题描述】:

我正在使用 5 个标准集合并两个数据集,条件是如果在标准集编号 n 下创建匹配项,则这些观察结果将无法在任何其他标准集 下进行匹配x > n。例如,如果在数据集 1:observation 10 和 dataset2:observation15 之间设置的第一个标准下合并成功,则这两个观察值不符合在任何后面的标准(第二、第三、第四、第五)下合并的条件。

到目前为止,我的方法是将标志变量添加到由合并创建的表中,然后将该表合并回两个父数据集,然后对于下一个标准集,我要求缺少标志变量。但是,我有很大的新数据集,并且此方法由于“资源不足”错误而失败。这很简单,但很抱歉。提前感谢您的阅读。

前两个条件的当前代码示例:

* Initialize parent datasets
data work.parentdata1;
set lib.parentdata1;
run;

data work.parentdata2;
set lib.parentdata2;
run;

***************;
*Criteria set 1;
***************;
proc sql;
create table match_1 as
select *
from parentdata1 o, parentdata2 t
    where o.variable_A = t.variable_a
    and o.variable_B= t.variable_b
;
quit;

* Results dataset (to be used for later analysis);
data work.match_1;
    set match_1;
    match_quality = 1;
run;

* Dataset for merge with parent dataset 1;
data work.mergematched_1;
    set match_1;
    match_dummy = 1;
run;

* sort matched table by parent dataset 1 id to prepare for parent merge;
proc sort data = work.mergematched_1;
    by id1;
run;

* merge matched observations back to parent dataset 1 to disqualify from      future criteria sets;
data work.parentdata1_a;
    merge work.parentdata1 work.mergematched_1;
    by id1;
run;

*sort matched table by parent dataset 2 id to prepare for parent merge;
proc sort data = work.mergematched_1;
    by id2;
run;

*merge matched observations back to parent dataset 2 to disqualify from   future criteria sets;
data work.parentdata2_a;
    merge work.parentdata2 work.mergematched_2;
    by id2;
run;
***************;
*Criteria set 2;
***************;
proc sql;
create table match_2 as
select *
from parentdata1 o, parentdata2 t
where o.match_dummy = . and t.match_dummy = .
and o.variable_X = t.variable_x
and o.variable_Y= t.variable_y
;
quit;

* Results dataset (to be used for later analysis);
data work.match_2;
set match_2;
match_quality = 2;
run;

* Dataset for merge with parent dataset 1a;
data work.mergematched_2;
set match_2;
match_dummy = 1;
run;

* sort matched table by parent dataset 1a id to prepare for parent merge;
proc sort data = work.mergematched_2;
by id1;
run;

* merge matched observations back to parent dataset 1a to disqualify from      future criteria sets;
data work.parentdata1_b;
merge work.parentdata1_a work.mergematched_2;
by id1;
run;

*sort matched table by parent dataset 2a id to prepare for parent merge;
proc sort data = work.mergematched_2;
by id2;
run;

*merge matched observations back to parent dataset 2a to disqualify from future criteria sets;
data work.parentdata2_b;
merge work.parentdata2_a work.mergematched_2;
by id2;
run;

【问题讨论】:

  • 您加入 PROC SQL 而不是 datastep 的任何特殊原因?
  • 没有特别的原因。在我刚开始项目时遇到的资源中,proc sql似乎是首选的合并方法

标签: sql sas


【解决方案1】:

由于您在合并中仅使用 3 或 4 个值,请尝试删除所有其他变量并仅保留用于合并的变量,然后在最后合并回所有其他结果。

我也不知道您是否同时需要 match_1 和 merge_match1,因为除了添加另一个变量之外,它似乎不会更改文件。如果空间不足,请尽可能避免创建临时数据集。

我认为您也可以将几个步骤合并为一个,如下所示,这是 Criteria 1 下的前四个 procs/data 步骤。

proc sql;
create table match_1 as
select *, 1 as match_quality, 1 as match_dummy
from parentdata1 o
inner join parentdata2 t
on o.variable_A = t.variable_a
and o.variable_B= t.variable_b
order by id1
;
quit;

【讨论】:

  • 感谢您的回复。 2 cmets:我正在测试您的方法,但 proc sql 发出警告,所有变量都已存在于文件 match_x 上,所有标准 > 1。仅供参考,标准相似,例如标准 1 是与其他几个变量匹配的精确日期匹配,并且那么标准 2 是相同的,只是日期允许在 +/- 5 天内而不是完全匹配。
  • 第二条评论/问题:当我需要缺少变量而不是等于其他数据集中的对应变量时,使用“on”而不是“where”仍然有效。例如两个父数据集中必须缺少 match_dummy。所以我可以简单地添加“and o.match_dummy = . and t.match_dummy = .”在“按 id1 订购”之前?
  • Re Comment #1 - 需要为创建新表的每个条件重复此查询,与上面的代码相同。重新评论 2,是的,您应该能够添加约束,或者您也可以添加 where 子句。
  • 如果您的标准与评论 #1 中的一样,即完全匹配,然后在几天内可能值得使用 case 语句代替进行匹配,但您没有提供足够的详细信息关于问题中的实际问题,建议多于。
猜你喜欢
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多