可以使用SAS中的合并数据步骤对输出数据集进行子集化吗?

时间:2014-10-08 08:13:43

标签: merge sas

在使用merge语句合并两个数据集时,是否可以在创建输出数据集时对其进行子集化?

简而言之,这两种方法中的哪一种更好?

A)

data merge_output;
 merge
       merge_input1 (in = ina)
       merge_input2 (in = inb)
 ;
 by some_column;
 if ina and inb;
 if some_other_column eq 'Y' then output merge_output;
 else delete;
run;

B)

data merge_output (where = (some_other_column = 'Y'));
 merge
       merge_input1 (in = ina)
       merge_input2 (in = inb)
 ;
 by some_column;
 if ina and inb;
run;

根据我的经验,我已经看到使用方法A导致错误合并的情况,而方法B确实是成功的。我试图向更广泛的团队解释这一点,但找不到任何文档。

我认为在合并语句中创建数据集时删除行或子设置数据集会以某种方式搞砸在后台运行的合并过程。有人可以帮我解释一下或正确答案吗?

2 个答案:

答案 0 :(得分:1)

我相信你提到的“确定的成功”将是:

data merge_output;
 merge
       merge_input1 (in = ina)
       merge_input2 (in = inb)
 ;
 by some_column;
 if ina and inb and some_other_column eq 'Y';
run;

使用SAS工作14年,我相信我从未在输出数据集上使用where选项。

上面使用的IF语句(没有THEN)被称为subsetting IF,但它并没有真正对输出进行子集化(就像一些后期操作),它只是不允许一些输入记录继续完成剩下的数据步骤,最后输入输出数据集。

关于选项A)使用DELETE语句可能更“告诉”你正在做什么然后IF语句并且可以在没有OUTPUT语句的情况下使用,所以你也可以更多明确你在做什么:

data merge_output;
 merge
       merge_input1 (in = ina)
       merge_input2 (in = inb)
 ;
 by some_column;
 if ina and inb; /* "inner join" */
 if some_other_column ne 'Y' then delete; /* subset */
run;

根据我的经验,这是OUTPUT声明,通常会导致忘记将其添加到所有IF .. THEN .. ELSE..分支以获得预期结果。规则是,一旦使用OUTPUT语句,在数据步骤结束时就不会自动输出记录,因此您必须处理所需的所有记录。 所以我尝试在使用多个输出数据集时只使用OUTPUT语句。

答案 1 :(得分:1)

既不!如果必须使用“数据”步骤,则应先使用WHERE数据集选项,而不是稍后使用。我假设some_other_column已经在merge_input_table1中。如果它在另一个表中,则根据需要移动/复制。

WHERE数据集选项和语句可过滤不需要的数据行。这减少了处理,因为从PDV中排除了不需要的行。

data merge_output ;
 merge
       merge_input1 (in = ina where = (some_other_column = 'Y'))
       merge_input2 (in = inb)
 ;
 by some_column;
 if ina and inb;
run;

使用数据步骤执行合并,因为您指出存在意外结果的风险。过滤可能会在处理中隐含纠缠,从而导致意外结果。 SQL显然风险要小得多。您可以定义所需内容,SQL引擎将确定获取它的最佳方法。

proc sql;
    create table merge_output as
    select * 
    from   merge_input1 
    inner  join
           merge_input2
    on     merge_input1.some_column  eq merge_input2.some_column
    where  some_other_column eq 'Y'
    ;
quit;