我有这个数据集(一个简单的例子,但结构相同):
data have;
infile datalines delimiter=',';
length country city measure $50.;
input country $ city $ level measure $ mdate total;
informat mdate date9.;
format mdate date9.;
datalines;
England,London,1,Red doors opened,24MAR2014,4
England,London,1,Green doors opened,24MAR2014,6
England,London,2,Doors closed,24MAR2014,7
England,London,1,Red doors opened,25MAR2014,5
England,London,1,Blue doors opened,25MAR2014,4
England,London,1,Green doors opened,25MAR2014,3
England,London,2,Doors closed,25MAR2014,6
England,Manchester,1,Red doors opened,24MAR2014,3
England,Manchester,2,Doors closed,24MAR2014,1
England,Manchester,2,Doors closed,25MAR2014,4
Scotland,Glasgow,1,Red doors opened,24MAR2014,4
Scotland,Glasgow,1,Red doors opened,25MAR2014,3
Scotland,Glasgow,1,Green doors opened,25MAR2014,2
Scotland,Glasgow,2,Doors closed,25MAR2014,4
;;;;
run;
我希望每天输出每个国家/城市的“门打开”,然后小心打开门,然后关闭门,然后从关闭的门中打开门,以给出“余额”(每个国家/市)。在每个国家的末尾,我想要一行汇总每个国家的余额(每天)。
所以上面会给出类似的东西:
Country + City + Measure + 24MAR2014 + 25MAR2014
---------+------------+--------------------+-----------+----------
England + London + Red doors opened + 4 + 5
+ + Green doors opened + 6 + 3
+ + Blue doors opened + . + 4
+ + TOTAL DOORS OPENED + 10 + 12
+ + Doors closed + 7 + 6
+ + BALANCE + -3 + -6
+ Manchester + Red doors opened + 3 + .
+ + TOTAL DOORS OPENED + 3 + .
+ + Doors closed + 1 + 4
+ + BALANCE + -2 + 4
+ ALL + BALANCE + -5 + -2
Scotland + Glasgow + Red doors opened + 4 + 3
+ + Green doors opened + . + 2
+ + TOTAL DOORS OPENED + 4 + 5
+ + Doors closed + . + 4
+ + BALANCE + -4 + -1
+ ALL + BALANCE + -4 + -1
我故意将其留下,因此并非每个实例都显示每个度量,并且有时会丢失Doors Closed总数。 CAPS中的行是我想用PROC REPORT
添加的行,即不在原始数据中。
我使用PROC REPORT
获得了基本布局,但实际上并不知道在哪里开始按需插入小计。我添加了一个'级别'变量,试着给我订购/分组的东西。
每个输出页面我需要一个国家/地区,每个分组按行顺序保存行,即XXX门打开,TOTAL DOORS OPENED,门关闭,BALANCE,所以我想可能需要额外的列。
到目前为止,这就是我所做的:
proc report data=have out=proc;
by country;
columns city level measure mdate,total;
define city / group;
define level / group noprint;
define measure / group;
define mdate / across;
define total / analysis sum;
compute before level;
endcomp;
compute after level;
if level = 2 and break = '_level_' then do;
measure = 'TOTAL DOORS OPENED';
end;
endcomp;
run;
我知道我应该能够使用关卡变量做一些事情,所以我在它之前和之后添加了一些计算块并检查了输出数据集。我试图添加'TOTAL DOORS OPENED'的值,但这不起作用。
老实说,我刚刚开始使用PROC REPORT
,所以这有点超出了我的舒适范围。
感谢您的帮助。如果问题不明确,请告诉我。
答案 0 :(得分:1)
有时候(通常是我的工作领域)最好将PROC REPORT视为一个花哨的PROC PRINT并在数据集中进行计算。
我会添加一个像TYPE这样的变量,表示该条目是否告诉我们关于开门或关门的情况,然后按contry / city / level / type / day计算总和;我还会复制所有观察结果,其中level = 3(意思是表中的BALANCE),否定了TYPE =关闭的度量,然后按国家/城市/日计算总和,他们将所有结果一起堆叠在一个数据集中,并带有正确的键并转置ID =天。 PROC REPORT可以从那里拿走它。不要太信任COMPUTE块,它们通常很有用,但是很难调试。只需创建一个显示为所需表格的数据集,然后将其投放到REPORT。