我想动态地计算SAS表的最多n列。
我有什么:
data have;
input id Month d_201701 d_201702 d_201703 d_201704 d_201705 d_201706 d_201707 d_201708 d_201709 d_201710;
datalines;
1 201701 0 1 0 1 1 0 0 0 1 1
2 201702 . 0 2 1 2 2 0 0 1 2
3 201703 . . 1 3 3 4 0 0 1 3
4 201704 . . . 1 2 3 4 1 1 4
5 201704 . . . 15 30 5 5 5 5 5
;
run;
应该做什么:
data want; set have;
if Month = 201701 then do;
r_201701=max(d_201701,d_201702,d_201703); .... r_201708=max(d_201708,d_201709,d_201710);
end;
....
if Month = 201704 then do;
r_201704=max(d_201704,d_201705,d_201706); .... r_201708=max(d_201708,d_201709,d_201710);
end;
我不想采用这种简化的方法-不仅是因为它太耗时并且可能出现许多错别字,而且还因为我的文件中有4个月以上,超过10列(大约100列)。
我还希望动态设置列数(例如,用24代替如上所述的3)。
寻求帮助,
答案 0 :(得分:1)
这是完全动态的。您无需知道您有多少个日期,多少年或几月。它确实假定您有连续的日期,并且每个日期都有一个条目。
data have;
input id Month d_201701 d_201702 d_201703 d_201704 d_201705 d_201706 d_201707 d_201708 d_201709 d_201710;
datalines;
1 201701 0 1 0 1 1 0 0 0 1 1
2 201702 . 0 2 1 2 2 0 0 1 2
3 201703 . . 1 3 3 4 0 0 1 3
4 201704 . . . 1 2 3 4 1 1 4
5 201704 . . . 15 30 5 5 5 5 5
;
run;
proc transpose data=have out=long;
by id;
var d_:;
run;
data long_w_date;
set long;
date = input(compress(compress(_name_,, 'kd'), '_'), yymmn6.);
format date date9.;
run;
proc expand data=long_w_date out=want1;
by id;
id date;
convert col1 = col1_move3 / transformout=( reverse movmax 3 );
run;