Olá Holmes.
A maneira que vejo de fazer isso em SAS é transpor a primeira tabela (que você chamou de teste).
Para o exemplo que você montou, o transpose é simples:
*geração da tabela de exemplo;
data TABELA_TESTE;
input CLASSE $ NUM_3 NUM_4 NUM_5 NUM_6 NUM_7 NUM_8 NUM_9 NUM_10 NUM_11 NUM_12;
datalines;
R1 6.8 6.4 6.0 5.6 5.3 5.0 4.7 4.4 4.2 4.0
R2 6.9 6.5 6.1 5.7 5.4 5.0 4.8 4.5 4.3 4.1
R3 7.0 6.6 6.2 5.8 5.4 5.1 4.9 4.6 4.4 4.2
R4 7.1 6.7 6.3 5.9 5.6 5.3 5.0 4.7 4.6 4.3
R5 7.2 6.8 6.4 6.0 5.7 5.4 5.1 4.8 4.6 4.4
R6 7.4 7.0 6.6 6.2 5.8 5.5 5.3 5.0 4.8 4.6
R7 7.5 7.1 6.7 6.3 6.0 5.7 5.4 5.1 5.0 4.7
R8 7.7 7.3 6.9 6.5 6.2 5.8 5.6 5.3 5.1 4.9
R9 7.8 7.4 7.0 6.6 6.3 6.0 5.8 5.4 5.3 5.0
R10 8.0 7.6 7.2 6.8 6.5 6.2 5.9 5.6 5.4 5.2
;
run;
*geração;
data TABELA_HAVE;
input ID $ CLASSE $ NUM_ $;
datalines;
S1 R1 NUM_3
S2 R2 NUM_6
S3 R3 NUM_12
S4 R4 NUM_10
S5 R5 NUM_3
S6 R6 NUM_11
S7 R7 NUM_6
S8 R8 NUM_7
S9 R9 NUM_8
S10 R10 NUM_9
;
run;
*ordena para usar o by no transpose;
proc sort data= tabela_teste; by classe; run;
*transpose: testet será nossa tabela agora e terá nXp linhas;
proc transpose data=tabela_teste out=testet (rename=(col1=resultado)) name=Num_;
var NUM_3-NUM_12;
by classe;
run;
*ordenação para cruzar;
proc sort data= TABELA_HAVE; by ID classe; run;
proc sort data= testet; by classe num_; run;
*cruzamento e manutenção só da tabela have;
data TABELA_HAVE_FINAL;
merge tabela_have (in=a)
testet (in=b);
by classe num_;
if a;
run;
Mas, caso tenha dificuldades, sugiro a documentação do TRANSPOSE que é bem completa:
TRANSPOSE Procedure
Espero que isso ajude.
Caso não ajude, conte o que faltou ou o que deu errado e a comunidade continuará tentando ajudar.