【问题标题】:How to find a match between two data sets and extract values in SAS如何在 SAS 中查找两个数据集之间的匹配项并提取值
【发布时间】:2016-05-25 09:12:59
【问题描述】:

我想比较两个数据集并将匹配的观察结果提取到新数据集。例如,

我有两个数据集,一个来自 10 月,另一个来自 11 月,如下所示。

10 月数据集

visitor_id ctn visits kjsjakd83 3243244234 1 sakdsadda 5432223442 2 jhk43242l 3243243244 1 iiiewdaja 9839422022 2

11 月数据集

visitor_id ctn visits kjsjakd83 3243244234 1 432hj4hj 3243243244 2 jhk43242l 3243243244 1 xfd3x424 2342344234 2

现在,我想通过 CTN 比较这些数据集,并从 10 月数据集中提取在 11 月数据集中找到匹配 CTN 的所有观察结果。因此,提取的数据集必须如下所示。

数据集匹配

visitor_id ctn visits kjsjakd83 3243244234 1 jhk43242l 3243243244 1

如何在 SAS 中做到这一点?

【问题讨论】:

  • 请发布您到目前为止尝试过的代码,这听起来像是一个简单的内部连接。我也不清楚最后一个数据集(匹配)是您引用的第三个数据集,还是您想要的输出数据集。最后,为什么在 11 月的数据中,同一个 ctn 有 2 个访问者 id?你认为哪一个相关?
  • proc sql; create table final as select Distinct a.CTN, a.visits from Nov a inner join Oct b on b.CTN = a.CTN; quit;
  • 上面的代码显示了来自两个数据集的匹配行但是我只想要匹配来自 11 月数据集的行

标签: sas proc-sql


【解决方案1】:

如果您只想要 OCTOBER 中 CTN 值为 11 月的记录,那么这似乎是最直接的 SQL 语法。

select * from OCTOBER 
  where CTN in (select CTN from NOVEMBER)
;

【讨论】:

    【解决方案2】:

    如果您将 oct “a” 和 nov “b” 设置为,您的代码可以正常工作。此外,正如 Keith 提到的,您的 nov 数据集中有重复的 ctn 值,您应该修复或解释您希望如何处理;最好加入 a.visitor_id = b.visitor_id 和 a.ctn = b.ctn。

    proc sql;
        create table final as select distinct
            a.* from oct as a inner join nov as b
            on a.ctn = b.ctn;
    quit;
    

    【讨论】:

    • 这实际上是正确的。 OP 确实需要加入两个 id 并仅返回 Nov 记录:b.* 请相应修改。
    【解决方案3】:

    @Tom 的回答是我会怎么做,但这里是没有PROC SQL 的方法:

    proc sort data=october;
      by ctn;
    run;
    
    proc sort data=november;
      by ctn;
    run;
    
    data match;
      merge october (IN=oct)
            november (IN=nov keep=ctn);
      by ctn;
      if oct and nov;
    run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多