Динамическое вычисление максимальной статистики в SAS - PullRequest
0 голосов
/ 28 сентября 2018

Я хотел бы динамически вычислить максимум из n столбцов таблицы SAS.

что у меня есть:

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 голосов
/ 28 сентября 2018

Это полностью динамично.Вам не нужно знать, сколько у вас дат, сколько лет или сколько месяцев.Предполагается, что у вас есть непрерывные даты и запись для каждой даты.

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;
...