1

proc sqlケースまたはレコードに情報が不足しているかどうかを識別するために、sasで使用したいと思います。2つのデータセットがあります。1つはデータ収集全体の記録であり、訪問中に収集されたフォームを示します。2つ目は、訪問中に収集する必要のあるフォームの仕様です。私はデータステップやSQLコードを含む多くのオプションをnot in無駄に使用して試しました...

データの例を以下に示します


*****  dataset crf is a listing of all forms that have been filled out at each visit ;
*****  cid is an identifier for a study center  ;
*****  pid is an identifier for a participant  ;

data crf;
  input visit cid pid form ;
cards;
1 10 101 10
1 10 101 11
1 10 101 12
1 10 102 10
1 10 102 11
2 10 101 11
2 10 101 13
2 10 102 11
2 10 102 12
2 10 102 13
;
run;


*****  dataset crfrule is a listing of all forms that should be filled out at each visit  ;
*****  so, visit 1 needs to have forms 10, 11, and 12 filled out  ;
*****  likewise, visit 2 needs to have forms 11 - 14 filled out  ;

data crfrule;
  input visit form ;
cards;
1 10
1 11
1 12
2 11
2 12
2 13
2 14
;
run;


*****  We can see from the two tables that participant 101 has a complete set of records for visit 1 ;
*****  However, participant 102 is missing form 12 for visit 1 ;
*****  For visit 2, 101 is missing forms 12 and 14, whereas 102 is missing form 14  ;


*****  I want to be able to know which forms were **NOT**  filled out by each person at each visit (i.e., which forms are missing for each visit)  ;


*****  extracting unique cases from crf ;
proc sql;
  create table visit_rec as
    select distinct cid, pid, visit
      from crf;
quit;



*****  building the list of expected forms by visit number ;
proc sql;
  create table expected as 
    select  x.*,
            y.*

    from visit_rec as x right join crfrule as y
      on x.visit = y.visit

    order by visit, cid, pid, form;
quit;


*****  so now I have a list of which forms that **SHOULD** have been filled out by each person  ;

*****  now, I just need to know if they were filled out or not...  ;

私が試みてきた戦略は、訪問ごとにどのフォームが欠落しているかを示すいくつかの指標を使用してexpected、テーブルにマージすることです。crf

最適には、visit、cid、pid、missing_formのテーブルを作成したいと思います。

どんなガイダンスでも大歓迎です。

4

3 に答える 3

2

ネストされたクエリをお勧めします。これは、2つのステップで実行することもできます。これはどうですか:

proc sql;
   create table temp as
   select distinct c.*
        , (d.visit is null and d.form is null and d.pid is null) as missing_form 
   from (
      select distinct a.pid, b.* from
      crf a, crfrule b
      ) c 
   left join crf d
   on     c.pid = d.pid 
      and c.form = d.form 
      and c.visit = d.visit
   order by c.pid, c.visit, c.form
   ;
quit;

pid、form、visit、およびそれが存在するかどうかを示すブール値のすべての可能な(つまり予想される)組み合わせのリストを提供します。

于 2013-01-25T06:45:40.350 に答える
2

EXCEPTはあなたが望むことをします。これが一般的に最も効率的なソリューションであるかどうかは必ずしもわかりませんが(SASでこれを実行している場合は、ほぼ確実にそうではありません)、これまでに行ったことを考えると、これは機能します。

create table want as
    select cid,pid,visit,form from expected
    except select cid,pid,visit,form from crf
;

EXCEPTには注意してください-非常に扱いにくいです(テーブルの順序が異なるため、select *は機能しないことに注意してください)。

于 2013-01-24T21:54:55.413 に答える
1

左結合を使用し、where句を使用して、右側のテーブルでレコードが欠落しているレコードを除外できます。

 select 
  e.* 
 from
  expected e left join 
  crf c on
   e.visit = c.visit and 
   e.cid = c.cid and
   e.pid = c.pid and
   e.form = c.form
 where c.visit is missing
;
于 2013-01-25T09:31:59.423 に答える