如何使用 SAS PROC SQL 进行最后一次观察
How to do a last observation carrying forward using SAS PROC SQL
我有以下数据。我想编写一个 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
因为您确实有一个有效的行号(访问),您可以这样做 - 虽然它 比数据步骤慢很多。
在这里,出于演示目的分成了单独的一列 - 当然,在您的情况下,您会希望将其合并为一列。
基本上,您需要一个子查询来确定最大访问次数小于当前具有合法权重计数的访问次数,然后将其加入 table 以获得权重。
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,对吗?
我不知道您为什么要使用 SQL 来执行此操作。在 SAS 中,数据步骤更适合该任务。我喜欢使用 "update trick"。如果您对它的工作原理感兴趣,我会留给您研究 UPDATE 语句。
data locf;
update sda(obs=0 keep=ptno) sda;
by ptno;
output;
if visit eq 1 then call missing(weight);
run;
我有以下数据。我想编写一个 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
因为您确实有一个有效的行号(访问),您可以这样做 - 虽然它 比数据步骤慢很多。
在这里,出于演示目的分成了单独的一列 - 当然,在您的情况下,您会希望将其合并为一列。
基本上,您需要一个子查询来确定最大访问次数小于当前具有合法权重计数的访问次数,然后将其加入 table 以获得权重。
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,对吗?
我不知道您为什么要使用 SQL 来执行此操作。在 SAS 中,数据步骤更适合该任务。我喜欢使用 "update trick"。如果您对它的工作原理感兴趣,我会留给您研究 UPDATE 语句。
data locf;
update sda(obs=0 keep=ptno) sda;
by ptno;
output;
if visit eq 1 then call missing(weight);
run;