Sas 阅读单个记录中的多个观察结果,并按月分组
我有一个数据集,每行包含四个月的观测值Sas 阅读单个记录中的多个观察结果,并按月分组,sas,Sas,我有一个数据集,每行包含四个月的观测值 1Sep11 389.00 1Oct11 491.00 1Nov11 370.00 1Dec11 335.00 2Sep11 423.00 2Oct11 478.00 2Nov11 407.00 2Dec11 442.00 3Sep11 482.00 3Oct11 300.00 3Nov11 303.00 3Dec11 372.00 我需要有一个数据集,它包含四列月份(九月、十月、十一月、十二月),每个月的读数放在右边的一列。例如 Day|Sep|Oct
1Sep11 389.00 1Oct11 491.00 1Nov11 370.00 1Dec11 335.00
2Sep11 423.00 2Oct11 478.00 2Nov11 407.00 2Dec11 442.00
3Sep11 482.00 3Oct11 300.00 3Nov11 303.00 3Dec11 372.00
我需要有一个数据集,它包含四列月份(九月、十月、十一月、十二月),每个月的读数放在右边的一列。例如
Day|Sep|Oct|Nov|Dec
1|389.00|491.00|370.00|335.00
2|423.00|478.00|407.00|442.00
3|482.00|300.00|303.00|372.00
如何在SAS中执行此操作?我尝试了@选项,但这只会帮助我读取行中的四个读数,并为每个读数创建一个观察值。您的原始数据是分类形式的。那太好了 您要求将数据(日期的月份部分)转换为元数据(月份名称作为列)。这意味着您将要处理数组或变量名列表 我建议您以分类形式保存数据。分类形式意味着您可以使用
CLASS
和BY
语句进行高效处理。使用Proc tablate
为输出或交付消耗安排数据项(如ODS EXCEL)
ODS列表输出
-------------------------------------------------------------
| | September | October | November | December |
|-------+------------+------------+------------+------------|
|1 | 389.00| 491.00| 370.00| 335.00|
|-------+------------+------------+------------+------------|
|2 | 423.00| 478.00| 407.00| 442.00|
|-------+------------+------------+------------+------------|
|3 | 482.00| 300.00| 303.00| 372.00|
-------------------------------------------------------------
如果您觉得必须转置数据,请将日期和月份划分为by
和id
data have2(keep=day month value);
attrib date informat=date9. format=date9.;
input date value @@;
day = day(date);
month = put(date,monname3.);
datalines;
1Sep11 389.00 1Oct11 491.00 1Nov11 370.00 1Dec11 335.00
2Sep11 423.00 2Oct11 478.00 2Nov11 407.00 2Dec11 442.00
3Sep11 482.00 3Oct11 300.00 3Nov11 303.00 3Dec11 372.00
run;
proc transpose data=have2 out=want2(drop=_name_);
by day;
var value;
id month;
run;
如果总日期范围超过一年,或者原始数据行未按月份分组或无序排列,您也会遇到问题。代码:
/* Step 1: Read each line in a string*/
data raw;
input line $ 1-70;
cards;
1Sep11 389.00 1Oct11 491.00 1Nov11 370.00 1Dec11 335.00
2Sep11 423.00 2Oct11 478.00 2Nov11 407.00 2Dec11 442.00
3Sep11 482.00 3Oct11 300.00 3Nov11 303.00 3Dec11 372.00
;;;
run;
/*Step 2: Exract the individual values separated by space */
data input;
set raw;
September= input(scan(line,1,' '),date7.);
S_Value= scan(line,2,' ');
October= input(scan(line,3,' '),date7.);
O_Value= scan(line,4,' ');
November= input(scan(line,5,' '),date7.);
N_Value= scan(line,6,' ');
December= input(scan(line,7,' '),date7.);
D_Value= scan(line,8,' ');
format September October November December date7. ;
drop line;
put _ALL_;
run;
输出:
September=01SEP11 S_Value=389.00 October=01OCT11 O_Value=491.00
November=01NOV11 N_Value=370.00 December=01DEC11 D_Value=335.00 _ERROR_=0 _N_=1
September=02SEP11 S_Value=423.00 October=02OCT11 O_Value=478.00
November=02NOV11 N_Value=407.00 December=02DEC11 D_Value=442.00 _ERROR_=0 _N_=2
September=03SEP11 S_Value=482.00 October=03OCT11 O_Value=300.00
November=03NOV11 N_Value=303.00 December=03DEC11 D_Value=372.00 _ERROR_=0 _N_=3
谢谢。这个解决方案奏效了。是的,我现在需要使用数组功能来找出每日使用量的差异,以及每个月与9月份的差异。
September=01SEP11 S_Value=389.00 October=01OCT11 O_Value=491.00
November=01NOV11 N_Value=370.00 December=01DEC11 D_Value=335.00 _ERROR_=0 _N_=1
September=02SEP11 S_Value=423.00 October=02OCT11 O_Value=478.00
November=02NOV11 N_Value=407.00 December=02DEC11 D_Value=442.00 _ERROR_=0 _N_=2
September=03SEP11 S_Value=482.00 October=03OCT11 O_Value=300.00
November=03NOV11 N_Value=303.00 December=03DEC11 D_Value=372.00 _ERROR_=0 _N_=3