您需要將您的數據來創建你在看(小時每個時間段一行,例如,如果你想顯示的人誰每個過程中存在的任何一點#小時)。
你可以做這樣的事情:
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;
,然後使用相同的匱乏和SGPLOT代碼。
來源
2014-07-07 21:48:41
Joe
謝謝喬。我已經有一個這樣的專欄。我添加了一個條件,如果開始介於0-1和1之間。我知道這不是最好的辦法。我試過你的代碼,它給了我這個錯誤 - 「錯誤:無效的DO循環控制信息,INITIAL或TO表達式丟失或BY表達式丟失,零, 或無效。」 – learnlearn10
使用PROC EXPAND嘗試 - proc expand data =輸入輸出=從=分鐘到=小時的輸出; id start; 開始; convert subject/method = aggregate observed = average; 跑;/*出現此錯誤 - 「錯誤:發現重複ID值的觀察值,數據集 輸入中的觀察值編號2處的ID變量值start = 0:04:00與先前的觀察值相同。 – learnlearn10
我不明白你的第一條評論。您顯示的數據在02:00到21:00之間有一行。我建議你需要19或20行(取決於你如何定義的東西)。你的數據不是這樣嗎? – Joe