在SAS中动态计算最大统计量

时间:2018-09-28 13:53:45

标签: sas

我想动态地计算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)。

寻求帮助,

1 个答案:

答案 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;