【问题标题】:SAS - compare two variables in two datsetsSAS - 比较两个数据集中的两个变量
【发布时间】:2013-08-22 03:52:15
【问题描述】:

我有两个患者数据集,正在尝试制作一个数据; 我的第一个数据是住院病人,第二个是门诊病人。我想比较两个数据集以查看门诊就诊数据是否有患者,然后我想向住院数据添加一个新变量,比如说 OP_var 并将其标记为“是”,如果门诊数据中不存在住院数据患者,那么我想将 OP_var 标记为“否”。

例如`

data inpatient;
input PID adm_dt dis_dt hsp_id @@;
cards;
1 01/01/2013 01/03/2013 10001
2 01/03/2013 01/04/2013 10110
3 01/10/2012 01/12/2012 10010
4 01/11/2013 01/17/2013 10000
;;

data outpatient;
input PID adm_dt_op dis_dt_op hsp_id_op @@;
cards;
1 01/05/2013 01/05/2013 10000
2 01/06/2013 01/06/2013 10111
4 01/19/2013 01/19/2013 10001
;;

data want;

PID  adm_dt     dis_dt     hsp_id adm_dt_op dis_dt_op   hs_id_op OP
1    01/01/2013 01/03/2013 10001  01/05/2013 01/05/2013 10000    Yes
2    01/03/2013 01/04/2013 10110  01/06/2013 01/06/2013 10111    Yes
3    01/10/2012 01/12/2012 10010  .          .           .       No
4    01/11/2013 01/17/2013 10000  01/19/2013 01/19/2013 10001    Yes`

【问题讨论】:

    标签: variables compare sas


    【解决方案1】:

    这个非常基本的问题有很多解决方案。合并两个数据集:

    data want;
    merge inpatient(in=i) outpatient(in=o keep=PID);
    if i;
    if o then Outpatient='Yes';
    else outpatient='No';
    run;
    

    即使您有多个要合并的变量也可以工作,但确实需要排序,因此对于非常大的数据集可能会很慢。

    创建格式:

    data op_format;
    start=pid;
    label='Yes';
    fmtname='Outpf';
    output;
    if _n_ = 1 then do;  *add a row that instructs it what to do with nonmatching records;
    hlo='o';
    label='No';
    output;
    end;
    run;
    
    proc format cntlin=op_format;
    quit;
    
    data want;
    set inpatient;
    outpatient=put(pid,outpf.);
    run;
    

    仅适用于一个合并变量(没有像将值组合在一起这样的愚蠢技巧)。

    如果这两个都不适合你,还有其他解决方案——SQL、哈希表等,具体取决于你的数据、你对各种事物的熟悉程度等。

    SQL解决方案,大致:

    proc sql;
    create table want as
      select I.*, case when missing(O.PID) then 'No' else 'Yes' end as OP
      from inpatient I left join outpatient O
      on I.pid=O.pid;
    quit;
    

    【讨论】:

    • 谢谢,看来您的合并选项在这种情况下可以使用,但由于数据集大,排序可能需要一些时间。是否可以在 PROC SQL 中做这样的事情?
    • SQL 仍然必须以某种方式进行排序,它不能只是神奇地组合记录:) 使用哈希表可能会更快,但我不知道它如果 PID 相当独特。
    【解决方案2】:

    这应该会有所帮助。抱歉,我大约一年前切换到 R 并且我的电脑上没有 SAS 进行测试。

        PROC SQL; 
         CREATE TABLE Patient_Matches AS 
         SELECT *
         FROM inpatient left join outpatient
         ON inpatient.PID = outpatient.PID 
         ; 
         QUIT;
    
    
         PROC SQL;
           ALTER TABLE Patient_Matches ADD OPchar(2);
           UPDATE Patient_MatchesSET myString='NO' where hs_id_op  = '';
           UPDATE Patient_MatchesSET myString='YES' where hs_id_op  <> '';
         quit;
    

    【讨论】:

    • 我正在尝试比较两个数据集之间的 PID,然后将 OP 变量标记为是或否。
    • 这太过分了。毕竟,他不需要门诊患者的 *,您可以使用 CASE 在选择中完成所有是/否的事情。
    • 这绝对是真的。我总是假设当人们在那里发帖时,他们需要快速解决方案,而我的机器上不再有 SAS 可供使用。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多