У меня есть набор данных с ключом и количеством баллов для различных факторов (A, B, C, D ...).Это выглядит примерно так:
data scores;
input KEY A B C D E F G H;
cards;
1 1 2 4 4 4 9 9 7
2 1 2 3 4 5 6 7 8
3 7 8 9 9 6 5 5 4
4 4 9 9 7 7 8 5 1
run;
Я пытаюсь получить рейтинг каждого фактора, который выглядит примерно так:
proc sql;
create table scorerank as
select *
,(ordinal(1,A,B,C,D,E,F,G,H)) as ScoreRank1
,(ordinal(2,A,B,C,D,E,F,G,H)) as ScoreRank2
,(ordinal(3,A,B,C,D,E,F,G,H)) as ScoreRank3
,(ordinal(4,A,B,C,D,E,F,G,H)) as ScoreRank4
,(ordinal(5,A,B,C,D,E,F,G,H)) as ScoreRank5
,(ordinal(6,A,B,C,D,E,F,G,H)) as ScoreRank6
,(ordinal(7,A,B,C,D,E,F,G,H)) as ScoreRank7
,(ordinal(8,A,B,C,D,E,F,G,H)) as ScoreRank8
from scores;
quit;
Моя проблема в том, что естьдинамическое количество факторов каждый раз.Это означает, что динамический список в порядковой функции и ScoreRankX соответствуют количеству баллов.
Я попытался сделать это как начало:
%let num = 8;
%let factors = A,B,C,D,E,F,G,H;
data datarank;
set scores;
do i = 1 to &num.;
ScoreRank&num. = (ordinal(&num.,&factors.));
end;
run;
ЯХорошо, чтобы изменить операторы% let в начале каждого кода, но я пытаюсь сделать ранжирование более автоматическим.Любая идея о том, как я могу улучшить вышеуказанный код, над которым я работаю?В настоящее время он выводит некорректно только с последним рангом и «i» (хотя у меня есть цикл do?).
Любая помощь очень ценится.