BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Holmes
Obsidian | Level 7

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?

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
cepmiranda
SAS Employee

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.

View solution in original post

2 REPLIES 2
cepmiranda
SAS Employee

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.

Holmes
Obsidian | Level 7
Muito obrigado!!!

Funcionou perfeitamente! E a solução bem tranquila, me ajudou a conhecer essa nova função!

Obrigado!