3

以下のデータがあります。各患者 (ptno) の最後の非欠損値を取得するために、sas proc SQL コードを記述したいと考えています。

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

実際には行番号 (訪問) があるので、これを行うことができますが、データ ステップよりもはるかに遅くなります。

これは、デモンストレーションのために別の列に分割されています-もちろん、あなたの場合、これを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 に答える