3

我有下面的数据。我想编写一个 sas proc sql 代码来获取每个患者(ptno)的最后一个非缺失值。

data sda;
input ptno visit weight;
format ptno z3. ;
cards;
1 1 122
1 2 123
1 3 .
1 4 .
2 1 156
2 2 .
2 3 70
2 4 .
3 1 60
3 2 .
3 3 112
3 4 .
;
run;

proc sql noprint;
create table new as
select ptno,visit,weight,
case 
                when weight = . then weight
                else .
                end as _weight_1
      from sda
group by ptno,visit
order by ptno,visit;
quit;

上面的sql代码效果不好。

愿望输出数据如下:

    ptno visit weight
    1      1    122
    1      2    123
    1      3    123
    1      4    123
    2      1    156
    2      2    .
    2      3    70
    2      4    70
    3      1    60
    3      2    .
    3      3    112
    3      4    112
4

2 回答 2

1

由于您确实有一个行号(访问),因此您可以这样做 - 尽管它数据步骤慢得多。

在这里,出于演示目的,将其分成单独的列 - 当然,在您的情况下,您将希望将其合并为一列。

基本上,您需要一个子查询来确定最大访问次数小于当前具有合法权重计数的访问次数,然后将其连接到表中以获得权重。

proc sql;
  select ptno, visit, weight, 
    (
        select weight 
            from sda A,
            (select ptno, max(visit) as visit
                from sda D
                where D.ptno=S.ptno
                and D.visit<S.visit
                and D.weight is not null
                group by ptno
            ) V
            where A.visit=V.visit and A.ptno=V.ptno
    )
    from sda S
    ;
quit;
于 2015-09-17T16:45:01.683 回答
1

尽管您没有那样描述它,但您不会继续进行 VISIT 1 对吗?

我不知道您为什么要使用 SQL 来执行此操作。在 SAS 中,数据步骤更适合该任务。我喜欢使用“更新技巧”。如果您对它的工作原理感兴趣,我将留给您研究 UPDATE 语句。

data locf;
   update sda(obs=0 keep=ptno) sda;
   by ptno;
   output;
   if visit eq 1 then call missing(weight);
   run;

在此处输入图像描述

于 2015-09-18T09:07:46.917 回答