【问题标题】:Comparing two sas datasets比较两个 sas 数据集
【发布时间】:2015-07-10 16:41:36
【问题描述】:

我有两个 sas 数据集

答案数据集

id   A1 A2 A3 A4  
1    A  B  C  D
2    B  B  C  A
3    A  A  D  D

还有一个关键数据集

A1 A2 A3 A4
A  B  C  D

问题是 SAS 中是否有一种方法可以循环遍历第一个数据集中的观察结果,并将它们与第二个数据集中的唯一观察结果进行比较。我对 SAS 很陌生,所以任何事情都会有所帮助

【问题讨论】:

    标签: sas


    【解决方案1】:
    proc sort data=a; by a1 a2 a3 a4; run;
    proc sort data=b; by a1 a2 a3 a4; run;
    
    data c;
      merge a(in=ina) b(in=inb)
      by a1 a2 a3 a4;
      if inb then b='Ý';
    run;
    

    它为匹配的数据创建带有指示符 b='Ý' 的数据集 a

    【讨论】:

      【解决方案2】:

      循环由数据步骤处理 - 它自动完成。

      将单行附加到另一个数据集中的所有行非常简单:

      data want;
        if _n_=1 then set have_onerow;
        set have;
      run;
      

      这仅在变量名称不同的情况下才有效 - 但这会将该行从 have_onerow 附加到 have 的所有行(因为 SET 中的变量会自动保留)。

      这不会为您进行比较 - 您必须这样做。

      但是,有一种方法可以使用它来生成 proc compare 数据集。只保留 ID 并执行上述操作:然后每个 ID 重复一次密钥。然后proc compare 将为您执行此操作 - 查看the documentation 以获取有关哪些选项在输出数据集中为您提供正确信息的更多信息。

      data have;
      input id   A1 $ A2 $ A3 $ A4 $ ;
      datalines;
      1    A  B  C  D
      2    B  B  C  A
      3    A  A  D  D
      ;;;;
      run;
      
      data key;
      input a1 $ a2 $ a3 $ a4 $;
      datalines;
      A B C D
      ;;;;
      run;
      
      data key_allrows;
        if _n_=1 then set key;
        set have (keep=id);
      run;
      
      proc compare base=key_allrows compare=have out=compare;
        by id;
      run;
      

      【讨论】:

      • 谢谢!但是我可以使用这个比较的结果来形成一个新的数据集吗?例如:如果 id 的不等式数量超过 2,则将此观察结果放入数据集“失败”
      • 是的。查看文档;它涵盖了许多不同的选项。上面应该产生第三个“比较”数据集,如果它们相同,则只有“........”,否则只有“X.......”(因为它们是 8字符很长,就像我懒惰地输入它们一样)。您有很多选项可以控制这一点。如果您尝试过此操作后,如果您有特定于 proc 比较的内容,请随意问另一个问题,如果它与这个问题有足够的不同!
      • 感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多