如何使用SAS PROC SQL进行最后一次观察

时间:2015-09-17 16:21:01

标签: sql sas locf

我有以下数据。我想写一个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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

enter image description here