2017-08-21 3 views
0

Les données est comme ça .....Création de plusieurs variables à l'aide de plusieurs variables SAS

Line1  Line2  Product_name Segment 1 Segment 2 

EUCREAS  ORAAL  EUCREAS  DPP-4  DPP-4 -EUCREAS 
GALVUS  ORAAL  GALVUS   DPP-4  DPP-4 -GALVUS 
GLICLAZIDE ORAAL  DIAMICRON  SU   SU -GLICLAZIDE 
GLICLAZIDE ORAAL  GLICLAZIDE  SU   SU -GLICLAZIDE 
GLP-1  ORAAL  BYDUREON  GLP-1  GLP-1 
GLP-1  ORAAL  BYETTA   GLP-1  GLP-1 
GLP-1  ORAAL  LYXUMIA  GLP-1  GLP-1 
GLP-1  ORAAL  VICTOZA  GLP-1  GLP-1 
INSULINES INSULINES ACTRAPHANE  INSULINES INSULINES 
INSULINES INSULINES ACTRAPID  INSULINES INSULINES 

ici, je dois utiliser line1, line2 et product_name pour créer segment1 & segment2.

Je peux utiliser l'instruction if mais existe-t-il d'autres façons de le faire dans l'étape data ou proc sql.

+0

Affichez ce que vous avez déjà essayé et expliquez votre logique. Comment le segment 1/segment 2 est-il calculé? Je pourrais probablement faire quelques suppositions mais c'est plus facile et plus rapide si vous expliquez votre problème. – Reeza

+0

En utilisant l'instruction if: - data dsn; –

+0

seg1 et seg2 dépend de certaines combinaisons de line1, line2 et product_name. donc j'ai utilisé si déclaration comme ceci et j'ai eu la sortie. données dsn; définir dsn1; si line1 = 'EUCREAS' et line2 = 'ORAAL' et product_name = 'EUCREAS' alors faites; seg1 = 'DPP-4'; seg2 = 'DPP-4-EUCREAS'; je veux savoir n'importe quelle façon plus courte que je peux faire ceci bcoz il ll b trop long pour mettre toutes les déclarations si; –

Répondre

2

En supposant que vous avez une cartographie assez simple de LINE1/LINE2/PRODUCT_NAME à vos segments, une belle façon de le faire est de créer un format:

proc format; 
    value $seg1f 
    'EUCREAS:ORAAL:EUCREAS' = 'DPP-4' 
    'GALVUS:ORAAL:EUCREAS' = 'DPP-4' 
    .... 
    ; 
    value $seg2f 
    'EUCREAS:ORAAL:EUCREAS' = 'DPP-4 - EUCREAS' 
    'GALVUS:ORAAL:EUCREAS' = 'DPP-4 - GALVUS' 
    .... 
    ; 
run; 

Vous pouvez alors simplement attribuer:

data want; 
    set have; 
    seg1 = put(catx(':', line1, line2, product_name), $seg1f.); 
    seg2 = put(catx(':', line1, line2, product_name), $seg2f.); 
run; 

Ou vous pouvez utiliser les mêmes formats dans une étape PROC SQL si c'est plus pratique. Vous devez réfléchir soigneusement au délimiteur à utiliser et vous ne pouvez pas appeler les formats seg1 et seg2 car les noms de format ne peuvent pas se terminer par des chiffres. Vous pouvez créer les formats par programme si nécessaire, voir l'option CNTLIN sur PROC FORMAT.

+0

merci. mais la sortie n'est pas correcte.ici ce que j'ai fait.PROC FORMAT; VALEUR $ SEG112F 'EUCREAS, ORAAL, EUCREAS' = 'DPP-4'; RUN; il devrait montrer une seule valeur pour seg1; mais il montre plus d'un voir la sortie; –

+0

Je ne vois aucune sortie nulle part, pouvez-vous le montrer? Affectez le résultat de votre fonction CATX à une variable temporaire afin que vous puissiez voir ce qui est transmis au format. –

+0

ici est le output-- Ligne1 \t Line2 \t product_name \t SEG1 EUCREAS \t ORAL \t EUCREAS \t DPP-4 GALVUS \t ORAL \t GALVUS \t GALVU gliclazide \t ORAL \t DIAMICRON \t GLICL gliclazide \t ORAL \t gliclazide \t GLICL GLP -1 \t ORAL \t BYDUREON \t GLP-1 GLP-1 \t ORAL \t \t BYETTA GLP-1 GLP-1 ORAL \t \t LYXUMIA GLP-1 GLP-1 ORAL \t \t \t VICTOZA GLP-1 insulines Insulines \t \t \t Actraphane INSU –