В SAS, как построить подсчет за недели, включая ноль? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать в SAS график, показывающий количество лабораторных результатов, которые отдельные лаборатории представляют каждую неделю в течение года. Мне удалось построить это, но график пропускает недели, в течение которых лаборатория представляла нулевые лабораторные результаты, то есть счет был бы нулевым.

data testlabs;
input labdate:datetime22.3 labname$;
cards;
08JAN2019:09:40:37.000 A
07AUG2019:09:36:16.000 A
08AUG2019:13:16:51.000 B
21APR2019:09:33:54.000 B
22APR2016:12:47:51.000 B
08JUN2019:09:25:50.000 B
09JAN2019:13:48:24.000 A
10JAN2019:12:21:02.000 C
19FEB2019:14:40:39.000 C
09MAR2019:09:38:48.000 C
20NOV2019:09:50:30.000 A
07AUG2019:14:03:55.000 A
09MAR2019:09:31:39.000 B
09JUN2019:12:11:29.000 B
04APR2019:17:00:00.000 B
26NOV2019:13:05:28.000 C
09JUN2019:09:38:50.000 C
06MAY2019:12:44:20.000 C
08MAY2019:10:14:52.000 A
08JUN2019:08:43:17.000 A
02DEC2019:12:26:51.000 A
05MAY2019:12:53:17.000 B
06SEP2019:09:52:36.000 C
10MAR2019:09:31:41.000 A
08MAR2019:09:40:40.000 C
14JUL2019:09:38:59.000 B
08JAN2019:10:40:37.000 A
;
run;

proc sql;
create table testlabs1 as
    select distinct count(*) as lab_count,
    labname,
    put(datepart(labdate),weeku6.)as wk
    from testlabs
    where year(datepart(labdate))>2018
    group by wk, labname
    order by labname, wk
    ;quit;


symbol color=blue interpol=join;
    proc gplot data=testlabs1;
        plot lab_count*(wk);
        by labname;
        run;quit;

Это создает три графика с точками только по неделям с хотя бы одной лабораторией. Я хотел бы построить все 52 недели в году, включая недели, в которых число равно нулю.

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вам нужен процесс, который может создать что-то из ничего. Опция COMPLETETYPES в SUMMARY / MEANS сделает это.

data testlabs;
   input labdate:datetime22.3 labname$;
   lbdate = datepart(labdate);
   format lbdate weeku6.;
   cards;
08JAN2019:09:40:37.000 A
07AUG2019:09:36:16.000 A
08AUG2019:13:16:51.000 B
21APR2019:09:33:54.000 B
22APR2016:12:47:51.000 B
08JUN2019:09:25:50.000 B
09JAN2019:13:48:24.000 A
10JAN2019:12:21:02.000 C
19FEB2019:14:40:39.000 C
09MAR2019:09:38:48.000 C
20NOV2019:09:50:30.000 A
07AUG2019:14:03:55.000 A
09MAR2019:09:31:39.000 B
09JUN2019:12:11:29.000 B
04APR2019:17:00:00.000 B
26NOV2019:13:05:28.000 C
09JUN2019:09:38:50.000 C
06MAY2019:12:44:20.000 C
08MAY2019:10:14:52.000 A
08JUN2019:08:43:17.000 A
02DEC2019:12:26:51.000 A
05MAY2019:12:53:17.000 B
06SEP2019:09:52:36.000 C
10MAR2019:09:31:41.000 A
08MAR2019:09:40:40.000 C
14JUL2019:09:38:59.000 B
08JAN2019:10:40:37.000 A
;;;;
   run;
proc print;
   run;
proc summary data=testlabs completetypes nway;
   class labname lbdate / mlf;
   output out=testlabs2(drop=_type_ rename=(_freq_=lab_count));
   run;
proc print;
   run;

enter image description here

enter image description here

0 голосов
/ 09 января 2020

Вы хотите объединить агрегат с помощью перекрестного объединения комбинаций wk x labname. Объединение будет дополнять совокупное покрытие комбинации, вызывая полное покрытие.

Пример:

data weeks;
  do week = intnx ('week', '01jan2019'd, 0) by 7 while (year(week) <= 2019);
    output;
  end;
  format week weeku6.;
run;

data labs;
  do labname = 'A', 'B', 'C', 'D'; output; end;
run;


proc sql;
create table testlabs1 as

select 

    labs.labname,
    year(weeks.week) as year,
    weeks.week,
    coalesce(aggregate.lab_count,0) as lab_count

from 

    labs

cross join 

    weeks

left join 

(
    select distinct count(*) as lab_count,
    labname,
    intnx('year', datepart(labdate), 0) as yr format=year4.,
    intnx('week', datepart(labdate), 0) as wk format=weeku6.
    from testlabs
    where year(datepart(labdate))>2018
    group by yr, wk, labname
) aggregate

    on aggregate.labname = labs.labname
     & aggregate.wk      = weeks.week

order by
    year, labname, week    

  ;
quit;



symbol color=blue interpol=join;
    proc gplot data=testlabs1;
        plot lab_count*(week);
        by year labname;
        where year = 2019;
        run;quit;
...