在SAS中,如何在数周内绘制计数,包括零计数?

问题描述 投票:0回答:2

我正在尝试在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周,包括计数为零的周。

plot count sas zero week-number
2个回答
1
投票

您需要一个可以从无到有创建事物的过程。 Summary / MEans中的COMPLETETYPES选项将执行此操作。

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
投票

您将希望通过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;
© www.soinside.com 2019 - 2024. All rights reserved.