我有一个数据,其中包含开始时间,结束时间,停留时间(结束开始)和主题数量。我正在尝试创建一个图形,线条,条形图或直方图,显示在特定时间有多少主题。因此水平轴的时间从00:00到24:00,垂直轴的总数为#或%。
Start End Subject Stay
01:00 02:00 1 01:00
01:00 01:45 1 00:45
02:00 21:00 1 19:00
03:10 14:10 1 11:00
数据集很大,我正在使用SAS Enterprise Guide和excel来创建图表。
我试过PROC GPLOT,但它没有提供我正在寻找的东西。对于线图和条形图(堆叠)做了同样的事情,但不能。我不确定是否有更简单的方法。这是我在SAS EG中使用的代码。尝试在excel中创建堆积条形图。
PROC GPLOT DATA=Input;
PLOT Stay * start /
AREAS=1
FRAME VAXIS=AXIS1
HAXIS=AXIS2
;
RUN; QUIT;
请帮忙。
由于
答案 0 :(得分:0)
您需要转换数据,为您正在查看的每个时间段创建一行(例如,如果您想要显示每小时内任何时间点出现的人数,则为小时)。
您可以这样做:
data want;
set have;
do time=intnx('Hour',start,0) to end by 3600; *start at top of current hour, increment by 1 hour (3600 seconds);
output;
end;
run;
然后,您可以在条形图中绘制time
变量。
您的数据可能是某些方法(例如ETS)的问题,因为您正在使用重叠时段 - 您的主题1有4个重叠严重的停留。如果这些日期不同,您可能需要在主题中添加日标记以使其唯一。
使用您的数据的示例:
data have;
input Start :time5. End :time5. Subject Stay :time5.;
format start end stay time5.;
datalines;
01:00 02:00 1 01:00
01:00 01:45 2 00:45
02:00 21:00 2 19:00
03:10 14:10 3 11:00
;;;;
run;
data want;
set have;
do hour_mark = intnx('Hour',start,0) to end by 3600;
output;
end;
keep hour_mark subject;
format hour_mark time5.;
run;
proc sgplot data=want;
vbar hour_mark;
run;
您可以使用更有趣的数据集运行相同的示例:
data have;
if _n_=1 then call streaminit(7);
do subject = 1 to 100;
start=floor(rand('Uniform')*86000);*almost all day, but make sure we have a bit of room for end;
end =floor(rand('Uniform')*(86400-start))+start;
stay=end-start;
output;
end;
format start end stay time5.;
run;
然后使用相同的WANT和SGPLOT代码。