IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Création d'une variable comptant le nombre de modalités d'une autre variable


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 39
    Points : 21
    Points
    21
    Par défaut Création d'une variable comptant le nombre de modalités d'une autre variable
    Bonjour,
    j'ai un problème pour créer une variable qui compte le nombre de fois qu'une modalité est repetée..On dispose au depart d'une table avec une variable qui n'a que des 0 et 1. J'aimerai créer une variable qui compte le nombre de fois que la modalité 1 est repetée. J'essaie de faire retain mais son problème est qu'il necessite que la table soit triée au depart, ce qu'on ne pourrait pas faire au risque de perdre des informations dans l'étude. Au fait les 0 et les 1 représentent des réalisations d'une action en un moment donné, on ne peut donc pas trier la table.L'objectif est d'avoir la variable var6 à partir de var1. J'ai essayé de créer les autres variables pour pouvoir avoir la variable var6. Mais j'arrive pas à cause du problème de tri.J'ai mis un exemple dans un tableau joint.

    Et le code éssayé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /* Création de la variable num qui s'incremente de 1 à chaque observation */
    			data tab;
    				set tab;
    				retain num 0;
    					num +1;
    			run;
    			/* Création de la variable var2 qui s'incremente à chaque changement de modalité de var1
    			 la variable var2 n'a pas pu etre créee car sa création necessite un tri de la table
    			tab selon var1, ce qu'on ne peut pas faire pour ne pas perdre les informations de l'étude */
    			data tab;
    				set tab;
    				BY var1;
    					retain var2 0 ;
    					IF first.var1 then var2=var2+1;
    			run;
    			/* Création de la variable var4 : même problème qu'avec la création de var2 */
    			data tab;
    				set tab;
    				BY var1;
    					retain var4 0 ;
    					IF first.var1 then var4=0;
    					var4 +1;
    			run;
    Merci d'avance.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    son problème est qu'il necessite que la table soit triée au depart, ce qu'on ne pourrait pas faire au risque de perdre des informations dans l'étude
    ne jamais dire ça.
    Si tu as besoin de faire des tris c'est toujours possible en retrouvant l'ordre initial.

    Il te suffit de créer une variable d'ordre V_Ordre=_N_;Ensuite tu peux faire tous les tris et manipulations que tu veux, lorsque tu auras fini il te suffira de remettre en ordre ton fichier pour retrouver l'ordre initial

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Proc Sort Data=Tab;By V_Ordre;RUN;
    Pour le reste j'ai l'impression que tu n'es pas suffisamment clair dans tes explications et ton tableau d'exemple trop court pour éclaircir tes explications.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Ok, merci Jerome, j vais essayer de créer une nouvelle variable pour pouvoir trier. Voici un autre tableau de ce que je voudrais obtenir (image-jointe). On dispose seulement de la variable var1 et on veut obtenir la variable var6. Au fait on veut savoir la durée d'une activité réalisée par une personne en un temps donné.Si la variable num représentait l'heure, on pourrait dire par exemple que la personne a commencé à jouer à partir de 3h et elle a fait 2h de jeu. Elle a ensuite commencé à jouer à 6h et elle a fait 3h de jeu. Ainsi de suite..
    Merci
    Images attachées Images attachées  

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Je crois que vous n’avez pas besoin de trier la table pour le problème posté. Il suffit d’utiliser l’option NOTSORTED.
    NOTSORTED précise que les lignes ne sont pas nécessairement dans l'ordre de tri, mais sont regroupées logiquement d'une autre manière (par ordre chronologique ou peut-être dans des catégories).
    Vous pouvez également créer les variables (var2 et var4) dans la même étape data.
    Pour la création de la var6, il faut déterminer le max de la var5 selon les modalités de la var2 en utilisant le code SQL. Voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    data tab ;
    input Var1 @@ ;
    cards ;
    0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 0 
    ;
     
    data tab_1 ;
    retain Var1-Var5 ;
    set  tab ;
    retain Var2 0 Var4 0 ;
    by Var1 NOTSORTED ;
     
    if first.Var1 then do ; Var4=0 ; Var2=Var2+1 ; end ;
                                     Var4=Var4+1 ;
    var3=var1*var2 ;
    var5=var1*var4 ;
    run;
     
    proc sql ; 
    create table  tab_2 as
    select *, max(var5) as var6
    from tab_1
    group by var2 ;
    quit ;
    Cdt
    Ward

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Exactement
    Et le code pour supprimer doublons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    %macro test;
    	%let debut = 1;						   
    	%let fin = 10;
    		data tab_2;
    			set tab_2;
    			call symput('a'!!left(_N_),a);
    		run;
    	 /* *************************** */
    	  %DO i = &debut %TO &fin ;
    	   	 		%if  &&a&i ^=0 %then %do ;
    				%let j=%sysevalf(&i+1);
    				%do %while( &&a&j);
    					%let a&j=0;
    					%let j=%sysevalf(&j+1);
    				%end;
    	 	   %end;
    	  %end;
    	  data tab_2;
    			set tab_2;
    			 v=symget('a'!!left(_N_));
    		run;
    	  data tab_2; /* pour changer le type caractère en num */
    			set tab_2;
    			 var6=input(v,12.);
    		run;
    	%mend test;
    	%test;
    Je vous remercie tous...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/12/2018, 11h08
  2. Réponses: 0
    Dernier message: 30/10/2008, 12h29
  3. Réponses: 3
    Dernier message: 14/03/2008, 11h03
  4. Concaténer une chaine et un nombre pour former un nom de variable ?
    Par debie1108 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/04/2007, 07h38
  5. Réponses: 1
    Dernier message: 23/04/2007, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo