Pessoal, tudo bem?
Preciso de uma grande ajuda. Estou com dois datasets, um eu tenho uma tabela assim:
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;
Minha segunda tabela:
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;
Eu preciso procurar o valor da Tabela_TESTE e trazer para a Tabela_HAVE.
Por exemplo, o S1 precisa retornar o valor 6.8. Pois ele é um R1 e NUM_3.
O que quero:
data TABELA_HAVE_FINAL; input ID $ RESULTADO; datalines; S1 6.8 S2 5.7 S3 4.2 S4 4.6 S5 7.2 S6 4.8 S7 6.3 S8 6.2 S9 6.0 S10 5.9 ; run;
Conseguem me ajudar?
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.
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.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.