【问题标题】:Start Time and End Time with freq or percentage带有频率或百分比的开始时间和结束时间
【发布时间】:2014-07-07 21:06:12
【问题描述】:

我有一个数据,其中包含开始时间、结束时间、停留时间(结束开始)和主题数。我正在尝试创建一个图表、线条、条形图或直方图,以显示特定时间有多少受试者。因此,水平轴的时间为 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;

请帮忙。

谢谢

【问题讨论】:

    标签: excel sas excel-2010 vba


    【解决方案1】:

    您需要转换您的数据,以便为您查看的每个时间段创建一行(例如,如果您想显示每小时在任何时间点出现的人数)。

    你可以这样做:

    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 代码。

    【讨论】:

    • 谢谢乔。我已经有一个这样的专栏。我添加了一个条件,如果 Start 介于 0-1 之间,则为 1。就像那样。我知道这不是最好的方法。我试过你的代码,它给了我这个错误-“错误:无效的 DO 循环控制信息,INITIAL 或 TO 表达式丢失或 BY 表达式丢失、零或无效。”
    • 尝试使用 PROC EXPAND - proc expand data=Input out=output from=minute to=hour ;身份证开始;开始;转换主题/方法=聚合观察=平均;跑; /* 得到这个错误 - “错误:发现重复 ID 值的观察。ID 变量的值,开始 = 0:04:00,在数据集输入中的观察号 2 处与之前的观察相同。”跨度>
    • 我不明白你的第一条评论。您显示 02:00 到 21:00 有一行的数据。我建议您需要 19 或 20 行(取决于您如何定义事物)。你的数据不是这样的吗?
    • 我添加了示例。我不确定 EXPAND;我认为它特别容易做到这一点,但如果不做更多工作,我不确定它是否有用,这基本上是复制另一种方法。
    猜你喜欢
    • 2016-09-24
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多